<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>Gleb</title><author><name>Gleb</name></author><id>https://teletype.in/atom/pastfin</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/pastfin?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/pastfin?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-06T10:50:45.051Z</updated><entry><id>pastfin:AM5xpJYePeI</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/AM5xpJYePeI?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Ubuntu установка программ</title><published>2026-01-24T21:56:27.969Z</published><updated>2026-01-24T21:56:27.969Z</updated><summary type="html">Создаем папку, например Database</summary><content type="html">
  &lt;h3 id=&quot;JsSM&quot;&gt;Установка Python&lt;/h3&gt;
  &lt;pre id=&quot;mw94&quot;&gt;sudo apt install -y python3 python3-venv

python3 -m venv ~/myenv
source ~/myenv/bin/activate&lt;/pre&gt;
  &lt;p id=&quot;yO6y&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;hkmF&quot;&gt;Установка Docker &amp;amp; Docker compose&lt;/h3&gt;
  &lt;pre id=&quot;yDpq&quot;&gt;sudo apt-get install ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
&amp;quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;$VERSION_CODENAME&amp;quot;) stable&amp;quot; | \
sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/pre&gt;
  &lt;p id=&quot;n6zP&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;c3YS&quot;&gt;PostgreSQL контейнер&lt;/h3&gt;
  &lt;p id=&quot;S72U&quot;&gt;Создаем папку, например Database&lt;/p&gt;
  &lt;p id=&quot;tIug&quot;&gt;Внутри папки создаем файл &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;YTsl&quot;&gt;Заполняем этот файл, поля &lt;code&gt;POSTGRES_PASSWORD и POSTGRES_DB&lt;/code&gt; вам надо заполнить самим:&lt;br /&gt;&lt;code&gt;services:&lt;br /&gt;  postgres:&lt;br /&gt;    image: postgres:16&lt;br /&gt;    container_name: my_postgres&lt;br /&gt;    restart: always&lt;br /&gt;    ports:&lt;br /&gt;      - &amp;quot;5432:5432&amp;quot;&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;HYuB&quot;&gt;&lt;code&gt;    environment:&lt;br /&gt;      POSTGRES_USER: root&lt;br /&gt;      POSTGRES_PASSWORD: {pwd}&lt;br /&gt;      POSTGRES_DB: {db_name}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nyh3&quot;&gt;&lt;code&gt;    volumes:&lt;br /&gt;      - ./postgres_data:/var/lib/postgresql/data&lt;br /&gt;      - ./init:/docker-entrypoint-initdb.d&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;5lll&quot;&gt;После чего из директории папки пишем &lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/p&gt;

</content></entry><entry><id>pastfin:WSEhAJOwZzz</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/WSEhAJOwZzz?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Aster Delta Neutral Bot</title><published>2025-09-23T02:47:34.164Z</published><updated>2025-09-23T02:47:34.164Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/fa/22/fa224962-e6a0-4070-888c-d942fa4a58ea.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/6c/6c/6c6c281b-d734-4a62-9382-404add9ba98b.jpeg&quot;&gt;Этот софт предназначен для открытия нейтральных позиций на множестве аккаунтов Aster. Например, когда 3 аккаунта открыты в лонг и 4 в шорт, общий баланс токенов остаётся нулевым, что создаёт нейтральную позицию. Количество лонг и шорт аккаунтов всегда одинаково или отличается максимум на один, однако объёмы токенов на каждом аккаунте могут различаться.</summary><content type="html">
  &lt;p id=&quot;awsx&quot;&gt;Этот софт предназначен для открытия нейтральных позиций на множестве аккаунтов Aster. Например, когда 3 аккаунта открыты в лонг и 4 в шорт, общий баланс токенов остаётся нулевым, что создаёт нейтральную позицию. Количество лонг и шорт аккаунтов всегда одинаково или отличается максимум на один, однако объёмы токенов на каждом аккаунте могут различаться.&lt;/p&gt;
  &lt;p id=&quot;5zA0&quot;&gt;Бот автоматически анализирует LTV после открытия позиций. При необходимости он закрывает нейтральные позиции и останавливает процесс, предоставляя пользователю возможность корректировать маржу на аккаунтах перед продолжением.&lt;/p&gt;
  &lt;h2 id=&quot;iny0&quot;&gt;Настройка бота&lt;/h2&gt;
  &lt;ol id=&quot;8Hch&quot;&gt;
    &lt;li id=&quot;8ol2&quot;&gt;Качаем репозиторий: &lt;code&gt;git clone &lt;a href=&quot;https://github.com/Pastfin/Aster-delta-neutral-bot&quot; target=&quot;_blank&quot;&gt;https://github.com/Pastfin/Aster-delta-neutral-bot&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;GaDc&quot;&gt;Открываем папку через VSC и устанавливаем зависимости через команду &lt;code&gt;pip install -r requirements.txt&lt;/code&gt; &lt;/li&gt;
    &lt;li id=&quot;uBbP&quot;&gt;Далее мы будем заполнять несколько нужных обязательных файлов:&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul id=&quot;k9Bv&quot;&gt;
    &lt;li id=&quot;KPO0&quot;&gt;data/api_keys.txt&lt;/li&gt;
    &lt;li id=&quot;j0qj&quot;&gt;data/config.json&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;vYt0&quot;&gt;Остальные файлы в data/ не трогаем.&lt;/p&gt;
  &lt;h3 id=&quot;ZcB9&quot;&gt;&lt;strong&gt;data/api_keys.txt&lt;/strong&gt;&lt;/h3&gt;
  &lt;ol id=&quot;vRpE&quot;&gt;
    &lt;li id=&quot;5hZw&quot;&gt;Генерируем API ключ: &lt;a href=&quot;https://www.asterdex.com/en/api-management&quot; target=&quot;_blank&quot;&gt;https://www.asterdex.com/en/api-management&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;Ypvk&quot;&gt;Записываем в api_keys.txt следующий формат, каждый аккаунт новая строка&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;sQsR&quot;&gt;&lt;code&gt;{apikey}:{apisecret}:{ip}:{port}:{log}:{pwd}&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;eXWh&quot;&gt;Пример записи:&lt;/p&gt;
  &lt;p id=&quot;yle4&quot;&gt;ab91f6e0d734b218c92fa11c4d9a52f9e8a17362e6e2c8f5c3f3a214bc89d72a:7f43d2a9bcf1d8e94520b33c67e9ad104e55d46d22a17f53e0d8a129cbb47119:178.45.210.88:5183:kuprezta:mqn65zd47ut1&lt;/p&gt;
  &lt;h3 id=&quot;Wmr2&quot;&gt;data/config.json&lt;/h3&gt;
  &lt;p id=&quot;R5qf&quot;&gt;&lt;code&gt;order_value_usd&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SoHE&quot;&gt;Средний объём позиции, открываемой одним аккаунтом. Например, если указаны значения &lt;code&gt;min = 200 USD&lt;/code&gt; и &lt;code&gt;max = 300 USD&lt;/code&gt;, то могут быть выбраны 2 аккаунта с лонг-позициями по 300 USD и 3 аккаунта с шорт-позициями по 200 USD. Важно учитывать, что софт использует случайные значения в этом диапазоне, поэтому суммы не обязательно будут круглыми и могут быть меньше минимального значения, указанного в конфиге.&lt;/p&gt;
  &lt;p id=&quot;KI7j&quot;&gt;&lt;code&gt;accounts_per_trade&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;k5nn&quot;&gt;Количество аккаунтов, участвующих в одном торговом цикле. Например, если указано &lt;code&gt;5 аккаунтов&lt;/code&gt;, то может быть &lt;code&gt;3 лонг&lt;/code&gt; и &lt;code&gt;2 шорт&lt;/code&gt;. Если &lt;code&gt;6 аккаунтов&lt;/code&gt; — то &lt;code&gt;3 лонг&lt;/code&gt; и &lt;code&gt;3 шорт&lt;/code&gt;. Софт случайным образом выбирает количество аккаунтов в пределах заданного диапазона &lt;code&gt;min&lt;/code&gt; и &lt;code&gt;max&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;kT5h&quot;&gt;&lt;code&gt;order_duration_min&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IKWO&quot;&gt;Продолжительность одной позиции в минутах.&lt;/p&gt;
  &lt;p id=&quot;U8Oh&quot;&gt;&lt;code&gt;delay_between_trading_cycles_min&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nNN9&quot;&gt;Время (в минутах), которое должно пройти перед началом нового торгового цикла с нейтральными позициями.&lt;/p&gt;
  &lt;p id=&quot;4Yna&quot;&gt;&lt;code&gt;delay_between_opening_orders_sec&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;kwtb&quot;&gt;Задержка (в секундах) между открытием отдельных ордеров в одном нейтральном цикле. Например, если используется &lt;code&gt;5 аккаунтов&lt;/code&gt;, то бот сначала открывает лонг на одном аккаунте, ждёт указанное время, затем открывает шорт и так далее.&lt;/p&gt;
  &lt;p id=&quot;wdiY&quot;&gt;&lt;code&gt;ltv_checks_sec&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;8hVI&quot;&gt;Частота проверки LTV сделки (в секундах). Софт берёт актуальную цену токена с Aster и сравнивает её с ценой ликвидации для определения уровня риска. Примечание: цена ликвидации берётся один раз в начале, далее в цикле обновляется только маржинальная цена (mark price).&lt;/p&gt;
  &lt;p id=&quot;tnFa&quot;&gt;&lt;code&gt;max_leverage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;iFyb&quot;&gt;Ограничение на максимальное значение позиции в USD для подстраховки, если баланс USDC на аккаунте недостаточен. Например, при &lt;code&gt;max_leverage = 2&lt;/code&gt; и балансе на аккаунте &lt;code&gt;200 USD&lt;/code&gt;, максимальная позиция будет &lt;code&gt;400 USD&lt;/code&gt;. Реальный размер позиции определяется параметром &lt;code&gt;order_value_usd&lt;/code&gt;, а этот параметр используется только для предотвращения превышения допустимого плеча.&lt;/p&gt;
  &lt;p id=&quot;4Q5h&quot;&gt;&lt;code&gt;max_position_ltv&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;D1pR&quot;&gt;Порог LTV, который софт мониторит на протяжении сделок. Проверка выполняется каждые &lt;code&gt;ltv_checks_sec&lt;/code&gt;. Если хотя бы на одном аккаунте достигается критический уровень LTV, бот закрывает все нейтральные позиции и завершает работу, чтобы пользователь мог скорректировать маржу.&lt;/p&gt;
  &lt;p id=&quot;43Tt&quot;&gt;LTV рассчитывается на основе текущей рыночной цены и цены ликвидации для каждой активной позиции. Информация о цене ликвидации записывается в момент открытия позиции и после данные не обновляются. То есть если капает фандинг, информация о цене ликвидации обновляться не будет.&lt;/p&gt;
  &lt;ul id=&quot;yryI&quot;&gt;
    &lt;li id=&quot;jM6w&quot;&gt;Если позиция в &lt;code&gt;SELL&lt;/code&gt;, LTV вычисляется как &lt;code&gt;current_price / liq_price * 100&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;6bLf&quot;&gt;Если позиция в &lt;code&gt;BUY&lt;/code&gt;, LTV вычисляется как &lt;code&gt;liq_price / current_price * 100&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;Ipqd&quot;&gt;&lt;code&gt;orders_distribution_noise&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Bvz5&quot;&gt;Показатель случайности распределения позиций. Чем выше значение, тем больше разница в размерах позиций.&lt;/p&gt;
  &lt;ul id=&quot;cPAc&quot;&gt;
    &lt;li id=&quot;sKZI&quot;&gt;Пример: Если &lt;code&gt;orders_distribution_noise = 0&lt;/code&gt;, то распределение будет равномерным (&lt;code&gt;1, 1, 1&lt;/code&gt; для лонга и шорта).&lt;/li&gt;
    &lt;li id=&quot;wJpU&quot;&gt;Если &lt;code&gt;orders_distribution_noise = 0.15&lt;/code&gt;, распределение будет более случайным (&lt;code&gt;0.9, 0.8, 1.3&lt;/code&gt;).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nPh7&quot;&gt;Этот параметр можно не изменять, если тебя устраивает равномерное распределение.&lt;/p&gt;
  &lt;p id=&quot;kAU9&quot;&gt;&lt;code&gt;retries&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nr1I&quot;&gt;Максимальное количество попыток выполнения одного действия в случае неудачи. Например, если сделка не открылась или не закрылась с первого раза, софт предпримет дополнительные попытки в пределах указанного числа.&lt;/p&gt;
  &lt;p id=&quot;0bMw&quot;&gt;&lt;code&gt;markets&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;w7Ic&quot;&gt;Пары, которые будут торговаться. Выбираются случайным образом.&lt;/p&gt;
  &lt;p id=&quot;pb2C&quot;&gt;&lt;code&gt;collateral_symbol&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;X9RN&quot;&gt;В чем держите свой коллатерал для фьючерсов. В софте используется для измерения размера ордера.&lt;/p&gt;
  &lt;p id=&quot;cvH0&quot;&gt;&lt;code&gt;debug_level&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yVUh&quot;&gt;Уровень логирования.&lt;/p&gt;
  &lt;ul id=&quot;YFS4&quot;&gt;
    &lt;li id=&quot;eZLP&quot;&gt;&lt;code&gt;&amp;quot;INFO&amp;quot;&lt;/code&gt; — стандартный режим использования.&lt;/li&gt;
    &lt;li id=&quot;xWgW&quot;&gt;&lt;code&gt;&amp;quot;DEBUG&amp;quot;&lt;/code&gt; — детализированный режим для отладки, когда возникают проблемы с кодом. Логи на уровне &lt;code&gt;DEBUG&lt;/code&gt; записываются в потенциально проблемных участках кода для упрощения поиска ошибок.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;Oz7K&quot;&gt;Функционал бота при запуске&lt;/h2&gt;
  &lt;figure id=&quot;O5tW&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/2d/b0/2db016a3-cde4-4aa8-a2db-262e362f4992.png&quot; width=&quot;360&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xyTE&quot;&gt;&lt;strong&gt;Start trading&lt;/strong&gt;&lt;br /&gt;Открывает позиции на указанных аккаунтах. Перед открытием проверяется, что на аккаунте нет активных позиций — если позиция уже открыта, софт завершает работу. На одном аккаунте может быть только одна активная позиция одновременно.&lt;/p&gt;
  &lt;p id=&quot;GsEY&quot;&gt;&lt;strong&gt;Accounts overview&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;fHet&quot;&gt;Выводит фьючерсный баланс и открытые позиции.&lt;/p&gt;
  &lt;p id=&quot;0fTc&quot;&gt;&lt;strong&gt;Close all open positions&lt;/strong&gt;&lt;br /&gt;Закрывает все активные позиции на всех аккаунтах.&lt;/p&gt;
  &lt;h2 id=&quot;fgoc&quot;&gt;Step by step&lt;/h2&gt;
  &lt;ol id=&quot;UNij&quot;&gt;
    &lt;li id=&quot;LFj8&quot;&gt;Скачиваем софт с гитхаба.&lt;/li&gt;
    &lt;li id=&quot;6BWV&quot;&gt;Устанавливаем библиотеки.&lt;/li&gt;
    &lt;li id=&quot;ekTD&quot;&gt;Заполняем все файлы, которые указаны в инструкции выше. Сначала тестируем с позициями по 50-100$.&lt;/li&gt;
    &lt;li id=&quot;5Bhu&quot;&gt;Запускаем софт и выбираем пункт 1: Start trading. запуск через команду &lt;code&gt;python main.py&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;uQq3&quot;&gt;Проверяем в логах и UI вручную, что нет никаких проблем. После запуска пункта &amp;quot;Start trading&amp;quot; выполняются базовые проверки ваших файлов и прокси.&lt;/li&gt;
    &lt;li id=&quot;XFyJ&quot;&gt;Чтобы остановить процесс, останавливаем софт, запускаем его заново и выбираем пункт: Close all currently open positions.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;ISuU&quot;&gt;Хорошего использования!&lt;/p&gt;
  &lt;p id=&quot;LTZQ&quot;&gt;TG канал: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>pastfin:A_1fEYZvl5C</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/A_1fEYZvl5C?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Paradex + Backpack Delta Neutral Bot [2]</title><published>2025-03-30T13:30:24.527Z</published><updated>2025-03-30T21:27:29.567Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/72/f5/72f57ab4-3765-49d7-a69f-dfc71025556f.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/b1/33/b1336648-c435-4797-96a4-1f7aaea08541.jpeg&quot;&gt;Софт предназначен для создания параллельных сделок между Paradex и Backpack с поддержкой многопоточности. Можно указать несколько аккаунтов (например, 5 Paradex и 5 Backpack), после чего сделки будут последовательно открываться на всех аккаунтах. Пример: BTC Long 1000$ на Paradex и BTC Short 1000$ на Backpack.</summary><content type="html">
  &lt;p id=&quot;4L7H&quot;&gt;Софт предназначен для создания параллельных сделок между Paradex и Backpack с поддержкой многопоточности. Можно указать несколько аккаунтов (например, 5 Paradex и 5 Backpack), после чего сделки будут последовательно открываться на всех аккаунтах. Пример: BTC Long 1000$ на Paradex и BTC Short 1000$ на Backpack.&lt;/p&gt;
  &lt;p id=&quot;4KNr&quot;&gt;Софт отслеживает LTV для каждой сделки. Если LTV превышает значение из конфигурации, соответствующий поток останавливается. Останавливается только один поток, остальные продолжают работать.&lt;/p&gt;
  &lt;p id=&quot;dyaR&quot;&gt;Логика аналогична первому боту, который работает только с Paradex. Подробное описание первого бота: &lt;a href=&quot;https://teletype.in/@pastfin/YN9jReHzZWx&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;.&lt;/p&gt;
  &lt;h2 id=&quot;5lAR&quot;&gt;Отличия от первого бота&lt;/h2&gt;
  &lt;ol id=&quot;GWRi&quot;&gt;
    &lt;li id=&quot;Q4EM&quot;&gt;Качаем репозиторий: &lt;code&gt;git clone &lt;a href=&quot;https://github.com/Pastfin/Paradex-Backpack-delta-neutral-bot&quot; target=&quot;_blank&quot;&gt;https://github.com/Pastfin/Paradex-Backpack-delta-neutral-bot&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;t9t0&quot;&gt;&lt;strong&gt;data/accounts_backpack.xlsx&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;Fg50&quot;&gt;
      &lt;li id=&quot;ger9&quot;&gt;Обязательные колонки: &lt;code&gt;api_key&lt;/code&gt;, &lt;code&gt;api_secret&lt;/code&gt;, &lt;code&gt;proxy&lt;/code&gt;, &lt;code&gt;is_active&lt;/code&gt;.&lt;/li&gt;
      &lt;li id=&quot;F0uZ&quot;&gt;Создается API ключ для Backpack вот здесь: &lt;a href=&quot;https://backpack.exchange/portfolio/settings/api-keys&quot; target=&quot;_blank&quot;&gt;https://backpack.exchange/portfolio/settings/api-keys&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;FI1t&quot;&gt;&lt;strong&gt;data/accounts_paradex.xlsx&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;BtlD&quot;&gt;
      &lt;li id=&quot;BwNo&quot;&gt;Формат аналогичен первому боту.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;0GMw&quot;&gt;&lt;strong&gt;data/active_pairs.xlsx&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;j6SE&quot;&gt;
      &lt;li id=&quot;KZGs&quot;&gt;Таблица с торговыми фьючерсными парами, которые есть как на Paradex, так и на Backpack. Указывайте только те пары, которые будут торговаться.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;sOEi&quot;&gt;&lt;strong&gt;data/config.json&lt;/strong&gt;&lt;/li&gt;
    &lt;ul id=&quot;9Tx8&quot;&gt;
      &lt;li id=&quot;jdnO&quot;&gt;Параметры те же, что и в первом боте.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;ISuU&quot;&gt;Хорошего использования!&lt;/p&gt;
  &lt;p id=&quot;LTZQ&quot;&gt;TG канал: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>pastfin:YN9jReHzZWx</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/YN9jReHzZWx?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Paradex Delta Neutral Bot</title><published>2025-03-29T20:11:05.311Z</published><updated>2025-03-30T20:24:33.470Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/62/69/62694737-296c-4096-852e-94e5a886f0a3.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img3.teletype.in/files/e7/1b/e71bd161-a4fd-4faf-b844-811920346b42.png&quot;&gt;Этот софт предназначен для открытия нейтральных позиций на множестве аккаунтов Paradex. Например, когда 3 аккаунта открыты в лонг и 4 в шорт, общий баланс токенов остаётся нулевым, что создаёт нейтральную позицию. Количество лонг и шорт аккаунтов всегда одинаково или отличается максимум на один, однако объёмы токенов на каждом аккаунте могут различаться.</summary><content type="html">
  &lt;p id=&quot;awsx&quot;&gt;Этот софт предназначен для открытия нейтральных позиций на множестве аккаунтов Paradex. Например, когда 3 аккаунта открыты в лонг и 4 в шорт, общий баланс токенов остаётся нулевым, что создаёт нейтральную позицию. Количество лонг и шорт аккаунтов всегда одинаково или отличается максимум на один, однако объёмы токенов на каждом аккаунте могут различаться.&lt;/p&gt;
  &lt;p id=&quot;5zA0&quot;&gt;Бот автоматически анализирует LTV после открытия позиций. При необходимости он закрывает нейтральные позиции и останавливает процесс, предоставляя пользователю возможность корректировать маржу на аккаунтах перед продолжением.&lt;/p&gt;
  &lt;h2 id=&quot;iny0&quot;&gt;Настройка бота&lt;/h2&gt;
  &lt;ol id=&quot;8Hch&quot;&gt;
    &lt;li id=&quot;8ol2&quot;&gt;Качаем репозиторий: &lt;code&gt;git clone &lt;a href=&quot;https://github.com/Pastfin/Paradex-delta-neutral-bot&quot; target=&quot;_blank&quot;&gt;https://github.com/Pastfin/Paradex-delta-neutral-bot&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;GaDc&quot;&gt;Открываем папку через VSC и устанавливаем зависимости через команду &lt;code&gt;pip install -r requirements.txt&lt;/code&gt; . Это самый сложный пункт, потому что могут возникнуть проблемы на Windows с установкой библиотеки starknet_py, которая используется для Paradex. Если произошла проблема, тогда есть два наиболее простых пути:&lt;/li&gt;
    &lt;ol id=&quot;Ty5j&quot;&gt;
      &lt;li id=&quot;BK3R&quot;&gt;Скачать Docker и запустить софт через контейнер. Команды для докера я оставлю в конце статьи.&lt;/li&gt;
      &lt;li id=&quot;ctDF&quot;&gt;Арендовать сервер на Linux, где всё просто установится&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li id=&quot;inQe&quot;&gt;Далее мы будем заполнять несколько нужных обязательных файлов:&lt;/li&gt;
  &lt;/ol&gt;
  &lt;ul id=&quot;6qfP&quot;&gt;
    &lt;li id=&quot;j0qj&quot;&gt;data/accounts.xlsx&lt;/li&gt;
    &lt;li id=&quot;Mrjz&quot;&gt;data/active_pairs.xlsx&lt;/li&gt;
    &lt;li id=&quot;Gh1v&quot;&gt;data/config.json&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;vYt0&quot;&gt;Остальные файлы в data/ не трогаем.&lt;/p&gt;
  &lt;h3 id=&quot;ZcB9&quot;&gt;&lt;strong&gt;data/accounts.xlsx&lt;/strong&gt;&lt;/h3&gt;
  &lt;p id=&quot;5hZw&quot;&gt;Excel файл, который содержит ваши аккаунты Paradex. Обязательные колонки к заполнению: private_key, address, proxy, is_active. &lt;strong&gt;Остальные колонки софт будет заполнять автоматически!&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;T9sN&quot;&gt;&lt;strong&gt;private_key &lt;/strong&gt;и &lt;strong&gt;address &lt;/strong&gt;получаем в личном кабинете Paradex:&lt;/p&gt;
  &lt;figure id=&quot;Nmhj&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/3b/f5/3bf5d776-67d4-4577-8d8b-874cd4376612.png&quot; width=&quot;258&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;Iy16&quot;&gt;&lt;strong&gt;proxy &lt;/strong&gt;формат обязательно должен быть &lt;strong&gt;ProxyIP:ProxyPort:ProxyLog:ProxyPwd&lt;/strong&gt;&lt;/p&gt;
  &lt;p id=&quot;T5wh&quot;&gt;&lt;strong&gt;is_active &lt;/strong&gt;формат должен быть записан как булевое значение. Если английская версия Excel, то TRUE или FALSE. Если русская версия, то ПРАВДА или ЛОЖЬ.&lt;/p&gt;
  &lt;h3 id=&quot;r0Rk&quot;&gt;data/active_pairs.xlsx&lt;/h3&gt;
  &lt;p id=&quot;MDOQ&quot;&gt;Эксель файл с торговыми парами Paradex, вам необходимо просто оставить нужные пары, которые будут случайным образом выбираться и торговаться. Ненужные пары просто удаляем. Для удобства анализа и выбора я сделал колонку Tier, которая классифицирует торговые пары в зависимости от торгового объема за последние 24 часа.&lt;/p&gt;
  &lt;h3 id=&quot;Wmr2&quot;&gt;data/config.json&lt;/h3&gt;
  &lt;p id=&quot;R5qf&quot;&gt;&lt;code&gt;order_value_usd&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;SoHE&quot;&gt;Средний объём позиции, открываемой одним аккаунтом. Например, если указаны значения &lt;code&gt;min = 200 USD&lt;/code&gt; и &lt;code&gt;max = 300 USD&lt;/code&gt;, то могут быть выбраны 2 аккаунта с лонг-позициями по 300 USD и 3 аккаунта с шорт-позициями по 200 USD. Важно учитывать, что софт использует случайные значения в этом диапазоне, поэтому суммы не обязательно будут круглыми и могут быть меньше минимального значения, указанного в конфиге.&lt;/p&gt;
  &lt;p id=&quot;ueiy&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;KI7j&quot;&gt;&lt;code&gt;accounts_per_trade&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;k5nn&quot;&gt;Количество аккаунтов, участвующих в одном торговом цикле. Например, если указано &lt;code&gt;5 аккаунтов&lt;/code&gt;, то может быть &lt;code&gt;3 лонг&lt;/code&gt; и &lt;code&gt;2 шорт&lt;/code&gt;. Если &lt;code&gt;6 аккаунтов&lt;/code&gt; — то &lt;code&gt;3 лонг&lt;/code&gt; и &lt;code&gt;3 шорт&lt;/code&gt;. Софт случайным образом выбирает количество аккаунтов в пределах заданного диапазона &lt;code&gt;min&lt;/code&gt; и &lt;code&gt;max&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;N9FJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;kT5h&quot;&gt;&lt;code&gt;order_duration_min&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;IKWO&quot;&gt;Продолжительность одной позиции в минутах. Paradex начисляет больше очков за более продолжительное удержание позиций. Например, если ты фармишь на протяжении &lt;code&gt;12-16 часов&lt;/code&gt;, то указываешь диапазон &lt;code&gt;720 - 960 минут&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;DWtF&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;U8Oh&quot;&gt;&lt;code&gt;delay_between_trading_cycles_min&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nNN9&quot;&gt;Время (в минутах), которое должно пройти перед началом нового торгового цикла с нейтральными позициями.&lt;/p&gt;
  &lt;p id=&quot;HuYY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;4Yna&quot;&gt;&lt;code&gt;delay_between_opening_orders_sec&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;kwtb&quot;&gt;Задержка (в секундах) между открытием отдельных ордеров в одном нейтральном цикле. Например, если используется &lt;code&gt;5 аккаунтов&lt;/code&gt;, то бот сначала открывает лонг на одном аккаунте, ждёт указанное время, затем открывает шорт и так далее.&lt;/p&gt;
  &lt;p id=&quot;10bY&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wdiY&quot;&gt;&lt;code&gt;ltv_checks_sec&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;8hVI&quot;&gt;Частота проверки LTV сделки (в секундах). Софт берёт актуальную цену токена с Paradex и сравнивает её с ценой ликвидации для определения уровня риска.&lt;/p&gt;
  &lt;p id=&quot;DwEc&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;tnFa&quot;&gt;&lt;code&gt;max_leverage&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;iFyb&quot;&gt;Ограничение на максимальное значение позиции в USD для подстраховки, если баланс USDC на аккаунте недостаточен. Например, при &lt;code&gt;max_leverage = 2&lt;/code&gt; и балансе на аккаунте &lt;code&gt;200 USD&lt;/code&gt;, максимальная позиция будет &lt;code&gt;400 USD&lt;/code&gt;. Реальный размер позиции определяется параметром &lt;code&gt;order_value_usd&lt;/code&gt;, а этот параметр используется только для предотвращения превышения допустимого плеча.&lt;/p&gt;
  &lt;p id=&quot;ysto&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;4Q5h&quot;&gt;&lt;code&gt;max_position_ltv&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;D1pR&quot;&gt;Порог LTV, который софт мониторит на протяжении сделок. Проверка выполняется каждые &lt;code&gt;ltv_checks_sec&lt;/code&gt;. Если хотя бы на одном аккаунте достигается критический уровень LTV, бот закрывает все нейтральные позиции и завершает работу, чтобы пользователь мог скорректировать маржу.&lt;/p&gt;
  &lt;p id=&quot;43Tt&quot;&gt;LTV рассчитывается на основе текущей рыночной цены и цены ликвидации для каждой активной позиции. Информация о цене ликвидации записывается в момент открытия позиции и после данные не обновляются. То есть если капает фандинг, информация о цене ликвидации обновляться не будет.&lt;/p&gt;
  &lt;ul id=&quot;yryI&quot;&gt;
    &lt;li id=&quot;jM6w&quot;&gt;Если позиция в &lt;code&gt;SELL&lt;/code&gt;, LTV вычисляется как &lt;code&gt;current_price / liq_price * 100&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;6bLf&quot;&gt;Если позиция в &lt;code&gt;BUY&lt;/code&gt;, LTV вычисляется как &lt;code&gt;liq_price / current_price * 100&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;1r1x&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;Ipqd&quot;&gt;&lt;code&gt;orders_distribution_noise&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;Bvz5&quot;&gt;Показатель случайности распределения позиций. Чем выше значение, тем больше разница в размерах позиций.&lt;/p&gt;
  &lt;ul id=&quot;cPAc&quot;&gt;
    &lt;li id=&quot;sKZI&quot;&gt;Пример: Если &lt;code&gt;orders_distribution_noise = 0&lt;/code&gt;, то распределение будет равномерным (&lt;code&gt;1, 1, 1&lt;/code&gt; для лонга и шорта).&lt;/li&gt;
    &lt;li id=&quot;wJpU&quot;&gt;Если &lt;code&gt;orders_distribution_noise = 0.15&lt;/code&gt;, распределение будет более случайным (&lt;code&gt;0.9, 0.8, 1.3&lt;/code&gt;).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;nPh7&quot;&gt;Этот параметр можно не изменять, если тебя устраивает равномерное распределение.&lt;/p&gt;
  &lt;p id=&quot;12il&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;kAU9&quot;&gt;&lt;code&gt;retries&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;nr1I&quot;&gt;Максимальное количество попыток выполнения одного действия в случае неудачи. Например, если сделка не открылась или не закрылась с первого раза, софт предпримет дополнительные попытки в пределах указанного числа.&lt;/p&gt;
  &lt;p id=&quot;q2lk&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;cvH0&quot;&gt;&lt;code&gt;debug_level&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;yVUh&quot;&gt;Уровень логирования.&lt;/p&gt;
  &lt;ul id=&quot;YFS4&quot;&gt;
    &lt;li id=&quot;eZLP&quot;&gt;&lt;code&gt;&amp;quot;INFO&amp;quot;&lt;/code&gt; — стандартный режим использования.&lt;/li&gt;
    &lt;li id=&quot;xWgW&quot;&gt;&lt;code&gt;&amp;quot;DEBUG&amp;quot;&lt;/code&gt; — детализированный режим для отладки, когда возникают проблемы с кодом. Логи на уровне &lt;code&gt;DEBUG&lt;/code&gt; записываются в потенциально проблемных участках кода для упрощения поиска ошибок.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;02hi&quot;&gt;&lt;/p&gt;
  &lt;h2 id=&quot;Oz7K&quot;&gt;Функционал бота при запуске&lt;/h2&gt;
  &lt;figure id=&quot;apNk&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/38/f4/38f4415f-1e59-44f2-9119-e69331ec0d86.png&quot; width=&quot;618&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;xyTE&quot;&gt;&lt;strong&gt;Start trading&lt;/strong&gt;&lt;br /&gt;Открывает позиции на указанных аккаунтах. Перед открытием проверяется, что на аккаунте нет активных позиций — если позиция уже открыта, софт завершает работу. На одном аккаунте может быть только одна активная позиция одновременно.&lt;/p&gt;
  &lt;p id=&quot;GsEY&quot;&gt;&lt;strong&gt;Fetch market data and update active trading pairs (data/active_pairs.xlsx)&lt;/strong&gt;&lt;br /&gt;Перезаписывает файл &lt;code&gt;data/active_pairs.xlsx&lt;/code&gt; и технический файл &lt;code&gt;data/pairs.json&lt;/code&gt;. Обновляет все расчётные колонки, чтобы пользователь мог выбрать подходящие торговые пары для дальнейшей работы.&lt;/p&gt;
  &lt;p id=&quot;Ubkb&quot;&gt;&lt;strong&gt;Update account balances and check for open positions (data/accounts.xlsx)&lt;/strong&gt;&lt;br /&gt;Обновляет текущий баланс аккаунтов и фиксирует информацию о любых открытых позициях. Результаты записываются в файл &lt;code&gt;data/accounts.xlsx&lt;/code&gt;.&lt;/p&gt;
  &lt;p id=&quot;0fTc&quot;&gt;&lt;strong&gt;Close all currently open positions&lt;/strong&gt;&lt;br /&gt;Закрывает все активные позиции на всех аккаунтах.&lt;/p&gt;
  &lt;h2 id=&quot;fgoc&quot;&gt;Step by step&lt;/h2&gt;
  &lt;ol id=&quot;UNij&quot;&gt;
    &lt;li id=&quot;LFj8&quot;&gt;Скачиваем софт с гитхаба.&lt;/li&gt;
    &lt;li id=&quot;6BWV&quot;&gt;Устанавливаем библиотеки.&lt;/li&gt;
    &lt;li id=&quot;ekTD&quot;&gt;Заполняем все файлы, которые указаны в инструкции выше. Сначала тестируем с позициями по 50-100$.&lt;/li&gt;
    &lt;li id=&quot;5Bhu&quot;&gt;Запускаем софт и выбираем пункт 1: Start trading.&lt;/li&gt;
    &lt;li id=&quot;uQq3&quot;&gt;Проверяем в логах и UI вручную, что нет никаких проблем. После запуска пункта &amp;quot;Start trading&amp;quot; выполняются базовые проверки ваших файлов и прокси.&lt;/li&gt;
    &lt;li id=&quot;XFyJ&quot;&gt;Чтобы остановить процесс, останавливаем софт, запускаем его заново и выбираем пункт: Close all currently open positions.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;xhsI&quot;&gt;Docker команды&lt;/h2&gt;
  &lt;h3 id=&quot;QpzU&quot;&gt;Запуск&lt;/h3&gt;
  &lt;ol id=&quot;FkI1&quot;&gt;
    &lt;li id=&quot;24u3&quot;&gt;&lt;strong&gt;&lt;code&gt;docker build -t paradex-image .&lt;/code&gt;&lt;/strong&gt; — Создаёт Docker-образ с именем &lt;code&gt;paradex-image&lt;/code&gt; на основе текущей директории (&lt;code&gt;.&lt;/code&gt;), где находится &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;wa0Y&quot;&gt;&lt;strong&gt;&lt;code&gt;docker run -dit --name paradex-container -v &amp;quot;${PWD}/data:/app/data&amp;quot; -v &amp;quot;${PWD}/logs:/app/logs&amp;quot; paradex-image&lt;/code&gt;&lt;/strong&gt; — Создаёт и запускает контейнер с именем &lt;code&gt;paradex-container&lt;/code&gt; в фоновом режиме (&lt;code&gt;-d&lt;/code&gt;). Примонтирует локальные папки &lt;code&gt;data&lt;/code&gt; и &lt;code&gt;logs&lt;/code&gt; в контейнер (&lt;code&gt;/app/data&lt;/code&gt; и &lt;code&gt;/app/logs&lt;/code&gt; соответственно) для сохранения данных и логов. Запускает контейнер на основе созданного образа &lt;code&gt;paradex-image&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;onat&quot;&gt;&lt;strong&gt;&lt;code&gt;docker exec -it paradex-container /bin/bash&lt;/code&gt;&lt;/strong&gt; — Открывает интерактивную оболочку внутри работающего контейнера &lt;code&gt;paradex-container&lt;/code&gt;. Позволяет выполнять команды вручную.&lt;/li&gt;
    &lt;li id=&quot;nYuK&quot;&gt;&lt;strong&gt;&lt;code&gt;python main.py&lt;/code&gt;&lt;/strong&gt; — Запускает основной код внутри контейнера.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;LsKO&quot;&gt;Выход&lt;/h3&gt;
  &lt;p id=&quot;Za1v&quot;&gt;&lt;strong&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/strong&gt; — Выход из контейнера, завершение интерактивной сессии. Контейнер продолжает работать, если был запущен в фоновом режиме.&lt;/p&gt;
  &lt;p id=&quot;wSCd&quot;&gt;&lt;strong&gt;&lt;code&gt;docker stop paradex-container&lt;/code&gt;&lt;/strong&gt; — Останавливает работающий контейнер &lt;code&gt;paradex-container&lt;/code&gt;. Процесс внутри контейнера прекращается.&lt;/p&gt;
  &lt;p id=&quot;cpYc&quot;&gt;&lt;strong&gt;&lt;code&gt;docker rm paradex-container&lt;/code&gt;&lt;/strong&gt; — Удаляет остановленный контейнер &lt;code&gt;paradex-container&lt;/code&gt;. Используй эту команду, если контейнер больше не нужен.&lt;/p&gt;
  &lt;p id=&quot;y69d&quot;&gt;&lt;strong&gt;&lt;code&gt;docker rmi paradex-image&lt;/code&gt;&lt;/strong&gt; — Удаляет Docker-образ &lt;code&gt;paradex-image&lt;/code&gt;. Используй эту команду, если образ больше не требуется.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;h3 id=&quot;psig&quot;&gt;Чистка&lt;/h3&gt;
  &lt;p id=&quot;86Ix&quot;&gt;&lt;strong&gt;&lt;code&gt;docker stop $(docker ps -q)&lt;/code&gt;&lt;/strong&gt; — Останавливает все запущенные контейнеры.&lt;/p&gt;
  &lt;p id=&quot;LFzO&quot;&gt;&lt;strong&gt;&lt;code&gt;docker rm $(docker ps -a -q)&lt;/code&gt;&lt;/strong&gt; — Удаляет все контейнеры, включая остановленные.&lt;/p&gt;
  &lt;p id=&quot;PkVH&quot;&gt;&lt;strong&gt;&lt;code&gt;docker rmi $(docker images -q) --force&lt;/code&gt;&lt;/strong&gt; — Удаляет все Docker-образы. Параметр &lt;code&gt;--force&lt;/code&gt; принудительно удаляет образы, даже если они используются контейнерами.&lt;/p&gt;
  &lt;p id=&quot;nUNP&quot;&gt;&lt;strong&gt;&lt;code&gt;docker volume prune -f&lt;/code&gt;&lt;/strong&gt; — Удаляет все неиспользуемые тома. Параметр &lt;code&gt;-f&lt;/code&gt; пропускает запрос на подтверждение.&lt;/p&gt;
  &lt;p id=&quot;6bQu&quot;&gt;&lt;strong&gt;&lt;code&gt;docker network prune -f&lt;/code&gt;&lt;/strong&gt; — Удаляет все неиспользуемые сети. Параметр &lt;code&gt;-f&lt;/code&gt; пропускает запрос на подтверждение.&lt;/p&gt;
  &lt;p id=&quot;6vyD&quot;&gt;&lt;strong&gt;&lt;code&gt;docker system prune -a --volumes -f&lt;/code&gt;&lt;/strong&gt; — Полная очистка системы. Удаляет все неиспользуемые контейнеры, образы, тома и кэш. Параметр &lt;code&gt;-a&lt;/code&gt; также удаляет образы без тегов. Параметр &lt;code&gt;--volumes&lt;/code&gt; включает удаление неиспользуемых томов. Параметр &lt;code&gt;-f&lt;/code&gt; пропускает запрос на подтверждение.&lt;/p&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;ISuU&quot;&gt;Хорошего использования!&lt;/p&gt;
  &lt;p id=&quot;LTZQ&quot;&gt;TG канал: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>pastfin:bXJHYcsylya</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/bXJHYcsylya?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Memhash автоматизация прожатия кнопки активности</title><published>2025-02-01T05:10:58.566Z</published><updated>2025-02-01T05:21:58.839Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img4.teletype.in/files/77/b9/77b9ed11-50a6-416b-bc5e-20c618eee111.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img4.teletype.in/files/ba/3a/ba3ab231-3563-4a2f-a8d4-a4a07f6d4ada.png&quot;&gt;Канал в тг: https://t.me/PastFinCoding</summary><content type="html">
  &lt;p id=&quot;aeuP&quot;&gt;Канал в тг: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;Fbub&quot;&gt;Сегодня разберем простой код, который поможет автоматически на ферме прожимать кнопку активности.&lt;/p&gt;
  &lt;h2 id=&quot;AiIm&quot;&gt;Требования&lt;/h2&gt;
  &lt;ul id=&quot;91Qt&quot;&gt;
    &lt;li id=&quot;QBuV&quot;&gt;&lt;strong&gt;Node.js&lt;/strong&gt;: необходим для запуска кода, написанного с использованием библиотеки на основе Puppeteer. Версия: 20.17.0&lt;/li&gt;
    &lt;li id=&quot;rATe&quot;&gt;&lt;strong&gt;Git&lt;/strong&gt;: требуется для загрузки моего кода.&lt;/li&gt;
    &lt;li id=&quot;resW&quot;&gt;&lt;strong&gt;Visual Studio Code (опционально)&lt;/strong&gt;: рекомендую использовать для написания и запуска кода.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;OtIK&quot;&gt;&lt;strong&gt;Node.js&lt;/strong&gt; можно скачать по ссылке: &lt;a href=&quot;https://nodejs.org/en/download/prebuilt-installer&quot; target=&quot;_blank&quot;&gt;Node.js Download&lt;/a&gt;. У меня установлена версия &lt;strong&gt;20.17.0&lt;/strong&gt;, установите такую же. Во время установки просто соглашайтесь со всеми дефолтными параметрами. После завершения установки откройте новое окно командной строки и выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;NLLx&quot;&gt;node --version&lt;/pre&gt;
  &lt;p id=&quot;LOYi&quot;&gt;Если всё установлено правильно, будет выведена версия Node.js.&lt;/p&gt;
  &lt;p id=&quot;JQ3W&quot;&gt;&lt;strong&gt;Git&lt;/strong&gt; можно скачать здесь: &lt;a href=&quot;https://git-scm.com/downloads/win&quot; target=&quot;_blank&quot;&gt;Git Download&lt;/a&gt;. Во время установки также соглашайтесь со всеми параметрами. После завершения установки откройте новое окно командной строки и выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;08pm&quot;&gt;git --version&lt;/pre&gt;
  &lt;p id=&quot;zf27&quot;&gt;Будет показана установленная версия Git.&lt;/p&gt;
  &lt;p id=&quot;fqd9&quot;&gt;Скачать &lt;strong&gt;Visual Studio Code&lt;/strong&gt; можно по следующей ссылке: &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot;&gt;VS Code Download&lt;/a&gt;, если вы ещё не установили его.&lt;/p&gt;
  &lt;h3 id=&quot;6yU5&quot;&gt;Логика работы кода&lt;/h3&gt;
  &lt;p id=&quot;oik1&quot;&gt;Прокси, рандомизация, использование кастомных user agents.&lt;/p&gt;
  &lt;ol id=&quot;kTOH&quot;&gt;
    &lt;li id=&quot;fsXi&quot;&gt;Открывается случайным образом аккаунт из списка&lt;/li&gt;
    &lt;li id=&quot;3bvZ&quot;&gt;Прожимается кнопка подтверждения активности&lt;/li&gt;
    &lt;li id=&quot;TwKK&quot;&gt;Далее начинается майнинг&lt;/li&gt;
    &lt;li id=&quot;ay8N&quot;&gt;После чего закрывается аккаунт и открывается следующий&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;ShZY&quot;&gt;Время майнинга и открытия между аккаунтами выбираете сами.&lt;/p&gt;
  &lt;h2 id=&quot;YipX&quot;&gt;Подготовка кода к запуску&lt;/h2&gt;
  &lt;p id=&quot;UbSU&quot;&gt;1) Создайте папку для проекта Memhash&lt;/p&gt;
  &lt;p id=&quot;wAvb&quot;&gt;2) Откройте папку в Visual Studio Code, запустите терминал и клонируйте репозиторий с помощью команды:&lt;/p&gt;
  &lt;pre id=&quot;j5Td&quot;&gt;git clone https://github.com/Pastfin/memhash-activity-automation.git .&lt;/pre&gt;
  &lt;p id=&quot;fR1p&quot;&gt;В результате вы получите следующие файлы:&lt;/p&gt;
  &lt;figure id=&quot;qg11&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/32/da/32daec0b-7cbe-4bb8-8fa1-5e68c7a8ad3c.png&quot; width=&quot;341&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;C294&quot;&gt;&lt;strong&gt;index.js&lt;/strong&gt; — основной код, который будет запускаться.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;SKIz&quot;&gt;&lt;strong&gt;config.json&lt;/strong&gt; — подстраиваете под себя задержки.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;cZAf&quot;&gt;&lt;strong&gt;activity.js&lt;/strong&gt; — прожатие кнопки активности по координатам.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;S1bJ&quot;&gt;&lt;strong&gt;minint.js&lt;/strong&gt; — прожатие кнопки майнинга по координатам.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;oIA1&quot;&gt;&lt;strong&gt;accounts.xlsx&lt;/strong&gt; — Excel-файл, в который нужно записать свои аккаунты. Столбцы: прокси (опционально, но надо), appLink (уникальная ссылка, покажу далее), skip (пропускать аккаунт или нет, значения TRUE или FALSE, если англ версия Excel; ПРАВДА или ЛОЖЬ, если ру версия Excel), user_agent (заполняете под каждый аккаунт какой user agent использовать), acc_name (optional)&lt;/blockquote&gt;
  &lt;p id=&quot;Lwb2&quot;&gt;3) Установите библиотеки. Для этого в терминале, находясь в папке проекта, выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;voGT&quot;&gt;npm install&lt;/pre&gt;
  &lt;p id=&quot;IlwJ&quot;&gt;4) Заполнить файл accounts.xlsx&lt;/p&gt;
  &lt;p id=&quot;BQ9h&quot;&gt;Для получения уникальной ссылки надо:&lt;/p&gt;
  &lt;ol id=&quot;ntag&quot;&gt;
    &lt;li id=&quot;76T4&quot;&gt;Открыть веб версию телеграма: &lt;a href=&quot;https://web.telegram.org/a/&quot; target=&quot;_blank&quot;&gt;https://web.telegram.org/a/&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;Z1rU&quot;&gt;Открыть приложение Мемхеша&lt;/li&gt;
    &lt;li id=&quot;CfMV&quot;&gt;Нажать правой кнопкой мыши на открывшееся приложение и нажать &amp;quot;просмотреть код&amp;quot;&lt;/li&gt;
    &lt;li id=&quot;Jmwz&quot;&gt;Далее в коде надо найти ссылку, которая начинается как &lt;a href=&quot;https://app.memhash.org/#&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;https://app.memhash.org/#&lt;/code&gt;&lt;/a&gt;, там можно использовать поиск через CTRL+F. Копируем полную ссылку, которая в src. Это и есть уникальная ссылка, которая позволит открывать приложение memhash вне телеграма.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;figure id=&quot;SYzQ&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/63/c2/63c28e51-14bd-4fe1-80be-b8cfca0c288c.png&quot; width=&quot;779&quot; /&gt;
  &lt;/figure&gt;
  &lt;h2 id=&quot;jvFF&quot;&gt;Запуск кода&lt;/h2&gt;
  &lt;p id=&quot;OxtC&quot;&gt;1) Откройте терминал в папке с кодом.&lt;/p&gt;
  &lt;p id=&quot;dhbe&quot;&gt;2) Выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;eh6f&quot;&gt;node index.js&lt;/pre&gt;
  &lt;p id=&quot;VYyk&quot;&gt;3) Кайфуем&lt;/p&gt;
  &lt;h3 id=&quot;rfxx&quot;&gt;Возможные трудности&lt;/h3&gt;
  &lt;ol id=&quot;1Ozp&quot;&gt;
    &lt;li id=&quot;RigV&quot;&gt;Не прожимаются кнопки. Тогда вам вручную надо изменить координаты в файлах activity.js, mining.js&lt;/li&gt;
    &lt;li id=&quot;vNRT&quot;&gt;Не успевает прогрузиться приложения. Вам вручную надо изменить тайминги в коде, он простой. Пример задержки 5 сек:                                        &lt;code&gt;await new Promise(resolve =&amp;gt; setTimeout(resolve, 5000));&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;

</content></entry><entry><id>pastfin:hlTslS6MvaV</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/hlTslS6MvaV?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Софт на Derive</title><published>2024-12-28T23:20:06.741Z</published><updated>2025-01-03T03:06:06.570Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img2.teletype.in/files/95/24/95241b48-cc19-4d5a-b204-c9a32519b413.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img2.teletype.in/files/19/5c/195c4f1c-8983-4566-a00e-f5125dffceee.png&quot;&gt;Откручиваем объемы, дедлайн 15 января</summary><content type="html">
  &lt;p id=&quot;HgUi&quot;&gt;&lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;asmf&quot;&gt;Настройка аккаунта на Derive&lt;/h2&gt;
  &lt;p id=&quot;C3wo&quot;&gt;Я взаимодействую с сайтом через антик и прокси. Прокси не ру, потому что ру по условиям в бане, но на сайт пускает.&lt;/p&gt;
  &lt;ul id=&quot;Nrlp&quot;&gt;
    &lt;li id=&quot;rm15&quot;&gt;Перейди по ссылке &lt;a href=&quot;https://www.derive.xyz/invite/55NI6&quot; target=&quot;_blank&quot;&gt;https://www.derive.xyz/invite/55NI6&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;D3qZ&quot;&gt;Нажми на кнопку Deposit now и внеси деньги. Рекомендую депать через оптимизм, комса около нуля. Также плюсом является, что можно вносить разные токены, не только стейбл. &lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;UKvZ&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7c/e1/7ce112dc-728d-4a30-bc27-3ee8850664d7.png&quot; width=&quot;246&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;jZkM&quot;&gt;
    &lt;li id=&quot;EPbJ&quot;&gt;Вверху слева нажми Home и ожидай пока транза зачислится&lt;/li&gt;
    &lt;li id=&quot;StA1&quot;&gt;После зачисления нажми на той же странице слева Balance. Далее надо перевести средства с Funding аккаунта на трейдинг аккаунт. Нажми на кнопку Transfer и переведи. Нужно подписать создание трейдинг аккаунта.&lt;/li&gt;
    &lt;li id=&quot;vaNg&quot;&gt;Перейди на той же странице на вкладку &amp;quot;Developers&amp;quot;, она размещена слева.&lt;/li&gt;
    &lt;li id=&quot;Kmmc&quot;&gt;Теперь я вкратце опишу, что мы будем делать. Ты привязал свой меин кошелек к аккаунту, ты можешь вносить деньги на Derive и выводить их. У Derive нет API ключа, но есть более интересное и безопасное решение:&lt;/li&gt;
    &lt;ul id=&quot;1kXc&quot;&gt;
      &lt;li id=&quot;TwF3&quot;&gt;Тебе надо создать EVM кошелек пустышку и сохранить от него приватный ключ. Этот кошелек-пустышка будет подписывать транзакции своим приватным ключом, когда будет обращаться к API Derive. Называется такой аккаунт Externally Owned Account (EOA). То есть передавать приватный ключ от твоего кошелька не надо, а только от пустышки. И подписывать он может только в скоупе Derive, выводить и вносить средства через этот приватник нельзя.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;DdAW&quot;&gt;На вкладке Developers нажми на кнопку Register Session Key. Назови как-нибудь и в строке Public Address укажи публичный ключ созданного кошелька-пустышки&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;7byr&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0b/87/0b879b70-3fc2-4022-8101-1e65021a622d.png&quot; width=&quot;230&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;FjBq&quot;&gt;
    &lt;li id=&quot;Nq9i&quot;&gt;После этих операций у тебя должно быть 3 сессии&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;1B8U&quot; class=&quot;m_column&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/41/01/4101f9b3-5225-48cb-b71b-436a0b6e0c5d.png&quot; width=&quot;2192&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;oHsG&quot;&gt;
    &lt;li id=&quot;CGPa&quot;&gt;Все готово, теперь осталось собрать данные для софта. Вот что понадобится:&lt;/li&gt;
    &lt;ul id=&quot;ztRj&quot;&gt;
      &lt;li id=&quot;UQJ0&quot;&gt;Derive wallet: &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;9yRV&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/ca/91/ca915587-672a-4229-8df1-f45b41d94a8a.png&quot; width=&quot;424&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;69YM&quot;&gt;
    &lt;ul id=&quot;M1RV&quot;&gt;
      &lt;li id=&quot;d6po&quot;&gt;Subaccount ID&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;CW3E&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/84/14/84147c05-4a0d-4e06-8bf0-f89b216124eb.png&quot; width=&quot;494.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;vtwf&quot;&gt;
    &lt;ul id=&quot;o7Xc&quot;&gt;
      &lt;li id=&quot;ydDJ&quot;&gt;Приватный ключ от пустого кошелька, который мы привязали к Derive через Register Session Key&lt;/li&gt;
      &lt;li id=&quot;eWsv&quot;&gt;http прокси&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;G8Wo&quot;&gt;Формат записи этих данных в следующем разделе по настройке софта.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;lZRM&quot;&gt;Настройка софта&lt;/h2&gt;
  &lt;p id=&quot;kKgq&quot;&gt;Предполагается, что у тебя уже установлен Python, у меня версия Python 3.11.5&lt;/p&gt;
  &lt;ol id=&quot;W5iO&quot;&gt;
    &lt;li id=&quot;TXiz&quot;&gt;Качаем репозиторий: &lt;code&gt;git clone &lt;a href=&quot;https://github.com/Pastfin/Derive-perp-delta-neutral-bot.git&quot; target=&quot;_blank&quot;&gt;https://github.com/Pastfin/Derive-perp-delta-neutral-bot.git&lt;/a&gt;&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;ULnq&quot;&gt;Открываем папку через VSC и устанавливаем зависимости через команду &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/li&gt;
    &lt;li id=&quot;gyHl&quot;&gt;В этой папке надо изменять всего два файла:&lt;/li&gt;
    &lt;ol id=&quot;5xVv&quot;&gt;
      &lt;li id=&quot;4RUF&quot;&gt;creds.txt&lt;/li&gt;
      &lt;li id=&quot;RbaP&quot;&gt;config.json&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li id=&quot;thcb&quot;&gt;Начнем с creds.txt. Этот файл должен содержать всю информацию об аккаунтах, которые ты будешь крутить. Формат записи следующий: DeriveWallet:SubaccountID:PrivateKeyEOA:ProxyIP:ProxyPort:ProxyLog:ProxyPwd&lt;/li&gt;
    &lt;ol id=&quot;aZ0t&quot;&gt;
      &lt;li id=&quot;wtfd&quot;&gt;Все данные записываются через &amp;quot;:&amp;quot; и без пробелов, новые строки через Enter, вносим все аккаунты в таком формате. 1 акк - 1 строка.&lt;/li&gt;
      &lt;li id=&quot;jeHD&quot;&gt;Как собрать все данные я показал в предыдущем пункте&lt;/li&gt;
    &lt;/ol&gt;
    &lt;li id=&quot;m4oh&quot;&gt;Теперь перейдем к настройке config.json. Я выложил свой конфиг, на котором кручу, но сейчас подробно опишу каждый параметр:&lt;/li&gt;
    &lt;ul id=&quot;Bgh2&quot;&gt;
      &lt;li id=&quot;0NQm&quot;&gt;pair_probability. Для твоей безопасности софт поддерживает только 3 пары для торговли: ETH, BTC. На других парах низкие объемы и я не смотрел. Ты можешь выставлять вероятность, что софт откроет сделку по той или иной паре. Например, при такой конфигурации шанс на эфир 90%, на биток 10%, на соль 0%&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;blockquote id=&quot;OOi3&quot;&gt;&amp;quot;pair_probability&amp;quot;: { &amp;quot;ETH&amp;quot;: 0.9, &amp;quot;BTC&amp;quot;: 0.1 }&lt;/blockquote&gt;
  &lt;ol id=&quot;U1LS&quot;&gt;
    &lt;ul id=&quot;sBeU&quot;&gt;
      &lt;li id=&quot;NuK9&quot;&gt;net_order_value_usd. Фактическая позиция без плеча. Устанавливается нижний и верхний порог через min max. Софт рандомно каждый раз выбирает в пределах от min до max&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;EIoj&quot;&gt;
      &lt;li id=&quot;XNIX&quot;&gt;leverage. Плечо на сделку. То есть если net_order_value_usd = 500$, а leverage = 3, то сделка будет открыта как 500$ * 3 = 1500$. Софт рандомно каждый раз выбирает в пределах от min до max. Только кросс маржа, изолированной на Derive нет&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;dvDZ&quot;&gt;
      &lt;li id=&quot;iera&quot;&gt;num_of_accounts_per_trade. Минимальное значение - 2 аккаунта. 2 аккаунта означает, что один встает в long, другой зеркально в short. 3 аккаунта означает, что один встает в long, два других встают в шорт. 4 аккаунта - 1 в лонг, 3 в шорт и тд. Long позиция будет всегда равняться сумме short позиций с одного или нескольких аккаунтов. Софт рандомно каждый раз выбирает в пределах от min до max и рандомно выбирает аккаунты&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;owSg&quot;&gt;
      &lt;li id=&quot;4pzt&quot;&gt;delay_open_close_minutes. Сколько минут от открытия сделки до ее закрытия. Не надо указывать слишком короткий промежуток времени, иначе могут сбрить за воштрейдинг. Софт рандомно каждый раз выбирает в пределах от min до max&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;lU88&quot;&gt;
      &lt;li id=&quot;xAqK&quot;&gt;delay_between_opening_new_position_minutes. После закрытия сделки сколько должно пройти минут, пока не откроется новая позиция. Софт рандомно каждый раз выбирает в пределах от min до max&lt;/li&gt;
    &lt;/ul&gt;
    &lt;ul id=&quot;madL&quot;&gt;
      &lt;li id=&quot;uOgP&quot;&gt;delay_between_opening_hedge_position_sec. Сколько должно пройти секунд между открытием позиций. То есть если 1 секунда и 5 аккаунтов, то встал в лонг, подолжал 1 сек, встал в шорт, подолжал 1 сек и тд. Софт рандомно каждый раз выбирает в пределах от min до max.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Vhba&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;E5lB&quot;&gt;Теперь поговорим про безопасность и какие фичи я написал.&lt;/p&gt;
  &lt;ol id=&quot;6YwA&quot;&gt;
    &lt;li id=&quot;93rk&quot;&gt;После каждого круга идет обновление баланса всех аккаунтов. Представим ситуацию, что ты поставил max плечо = 3 и max net_order_value_usd = 1000$. Однако аккаунт перелило и баланс остался 800$. То есть максимальная позиция может быть net_order_value_usd * leverage = 3000$, но 3000$ / 800$ = 3.75 плечо &amp;gt; 3, который в конфиге. Короче, код останавливается, чтобы тебя не ликвиднуло после перелива в случае чего.&lt;/li&gt;
    &lt;li id=&quot;E6At&quot;&gt;Если на каком-то этапе происходит ошибка, тогда запускается функция, которая закрывает все открытые позиции на всех аккаунтах из creds.txt и код останавливает. Не надо держать свои личные позиции под аккаунты, на котором будет работать софт.&lt;/li&gt;
    &lt;li id=&quot;3ruw&quot;&gt;Я также написал достаточное количество проверок в момент запуска кода, поэтому код не начнет открывать позиции, если ты где-то допустил ошибки.&lt;/li&gt;
    &lt;li id=&quot;SWAo&quot;&gt;Сделал как можно больше рандомизации.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;CUBf&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;M2eI&quot;&gt;Теперь поговорим, что не входит в скоуп кода:&lt;/p&gt;
  &lt;ol id=&quot;reBH&quot;&gt;
    &lt;li id=&quot;XA6X&quot;&gt;Код никак не анализирует твою цену ликвидации, не надо ставить высокие плечи. Если ликвидировало, то всё, капут.&lt;/li&gt;
    &lt;li id=&quot;9K7m&quot;&gt;Код сломается, если ты поставишь низкий net_order_value_usd и большое количество аккаунтов, потому что на Derive достаточно высокие критерии открытия позиции. Например, если ты поставил 34$ (0.01 ETH) в net_order_value_usd, плечо 2 и указал num_of_accounts_per_trade = 5, то код откроет сделку на лонг и сломается в момент распределения этих 68$ между 4 аккаунтами в шорт, потому что total_amount (68$) &amp;lt; minimum_amount (34$ (0.01 ETH минималка на Derive)) * num_short_accounts (4). В таком случае запустится функция по закрытию всех ордеров и код остановится.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;1Tmx&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;vQb1&quot;&gt;Рекомендации:&lt;/p&gt;
  &lt;ol id=&quot;20Mv&quot;&gt;
    &lt;li id=&quot;zeeh&quot;&gt;Если низкий деп, то не стоит делать больше 3 аккаунтов за раз в одной сделке (один лонг, два шорт).&lt;/li&gt;
    &lt;li id=&quot;FC2o&quot;&gt;Устанавливать адекватные плечи (2-3).&lt;/li&gt;
    &lt;li id=&quot;ffd0&quot;&gt;Если надо как можно больше и быстрее открутить, запускай параллельно два и больше процессов. То есть сделал 10 аккаунтов, скопировал папку с кодом, в одной папке указал 5 аккаунтов, в другой указал 5 других аккаунтов, запустил параллельно 2 софта.&lt;/li&gt;
    &lt;li id=&quot;8Dsc&quot;&gt;Делать селфрефнутые аккаунты.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;H0CG&quot;&gt;&lt;/p&gt;
  &lt;h3 id=&quot;IIDi&quot;&gt;Запуск кода&lt;/h3&gt;
  &lt;p id=&quot;wLgK&quot;&gt;Для запуска кода надо написать &lt;code&gt;python .\main.py&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;2HsK&quot;&gt;Если что-то произошло, то останови код main.py и запусти:&lt;/p&gt;
  &lt;p id=&quot;FKAn&quot;&gt;&lt;code&gt;python .\close_all_positions.py&lt;/code&gt;&lt;/p&gt;
  &lt;p id=&quot;41Yy&quot;&gt;Я отдельно вынес этот скрипт, чтобы если что закрывать все открытые существующие позиции на аккаунтах, которые указаны в creds.txt. Но на всякий случай потом лучше пробежаться по аккаунтам.&lt;/p&gt;
  &lt;p id=&quot;jTTJ&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;eUpv&quot;&gt;Чтобы код работал хорошо, надо перейти по моей рефке!!!&lt;/p&gt;
  &lt;p id=&quot;afwd&quot;&gt;&lt;a href=&quot;https://www.derive.xyz/invite/55NI6&quot; target=&quot;_blank&quot;&gt;https://www.derive.xyz/invite/55NI6&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;FoTi&quot;&gt;&lt;a href=&quot;https://www.derive.xyz/invite/55NI6&quot; target=&quot;_blank&quot;&gt;https://www.derive.xyz/invite/55NI6&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;VMac&quot;&gt;&lt;a href=&quot;https://www.derive.xyz/invite/55NI6&quot; target=&quot;_blank&quot;&gt;https://www.derive.xyz/invite/55NI6&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;1sec&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;mnvd&quot;&gt;И неплохо было бы подписаться на мой тг канал, чтобы снизить пинг до API: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>pastfin:KFv6xfsV5aK</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/KFv6xfsV5aK?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Story Protocol официальный кран - гайд по автоматизации</title><published>2024-10-02T17:42:57.273Z</published><updated>2024-10-06T14:43:02.178Z</updated><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/41/55/4155b214-29a4-46e2-bc56-77d53f48d492.png&quot;&gt;Канал в тг: https://t.me/PastFinCoding</summary><content type="html">
  &lt;p id=&quot;dHtH&quot;&gt;Канал в тг: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;kqzL&quot;&gt;Сегодня мы будем обходить десятерную защиту сайта &lt;a href=&quot;https://faucet.story.foundation/&quot; target=&quot;_blank&quot;&gt;https://faucet.story.foundation/&lt;/a&gt;, чтобы клеймить IP на кошельки c &lt;strong&gt;нулевым &lt;/strong&gt;или &lt;strong&gt;маленьким &lt;/strong&gt;гитпаспортом.&lt;/p&gt;
  &lt;h2 id=&quot;AiIm&quot;&gt;Требования&lt;/h2&gt;
  &lt;ul id=&quot;91Qt&quot;&gt;
    &lt;li id=&quot;QBuV&quot;&gt;&lt;strong&gt;Node.js&lt;/strong&gt;: необходим для запуска кода, написанного с использованием библиотеки на основе Puppeteer. Моя версия: 20.17.0&lt;/li&gt;
    &lt;li id=&quot;rATe&quot;&gt;&lt;strong&gt;Git&lt;/strong&gt;: требуется для загрузки моего кода.&lt;/li&gt;
    &lt;li id=&quot;resW&quot;&gt;&lt;strong&gt;Visual Studio Code (опционально)&lt;/strong&gt;: рекомендую использовать для написания и запуска кода.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;OtIK&quot;&gt;&lt;strong&gt;Node.js&lt;/strong&gt; можно скачать по ссылке: &lt;a href=&quot;https://nodejs.org/en/download/prebuilt-installer&quot; target=&quot;_blank&quot;&gt;Node.js Download&lt;/a&gt;. У меня установлена версия &lt;strong&gt;20.17.0&lt;/strong&gt;, установите такую же. Во время установки просто соглашайтесь со всеми дефолтными параметрами. После завершения установки откройте новое окно командной строки и выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;hFX5&quot;&gt;node --version&lt;/pre&gt;
  &lt;p id=&quot;LOYi&quot;&gt;Если всё установлено правильно, будет выведена версия Node.js.&lt;/p&gt;
  &lt;p id=&quot;JQ3W&quot;&gt;&lt;strong&gt;Git&lt;/strong&gt; можно скачать здесь: &lt;a href=&quot;https://git-scm.com/downloads/win&quot; target=&quot;_blank&quot;&gt;Git Download&lt;/a&gt;. Во время установки также соглашайтесь со всеми параметрами. После завершения установки откройте новое окно командной строки и выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;rrtG&quot;&gt;git --version&lt;/pre&gt;
  &lt;p id=&quot;zf27&quot;&gt;Будет показана установленная версия Git.&lt;/p&gt;
  &lt;p id=&quot;fqd9&quot;&gt;Скачать &lt;strong&gt;Visual Studio Code&lt;/strong&gt; можно по следующей ссылке: &lt;a href=&quot;https://code.visualstudio.com/&quot; target=&quot;_blank&quot;&gt;VS Code Download&lt;/a&gt;, если вы ещё не установили его.&lt;/p&gt;
  &lt;h3 id=&quot;XvQr&quot;&gt;Логика работы кода&lt;/h3&gt;
  &lt;ol id=&quot;y2By&quot;&gt;
    &lt;li id=&quot;EnT7&quot;&gt;Открывается браузер Chrome (с прокси или без).&lt;/li&gt;
    &lt;li id=&quot;Rpx8&quot;&gt;Запускается MetaMask.&lt;/li&gt;
    &lt;li id=&quot;VX4K&quot;&gt;Создаётся новый аккаунт в MetaMask.&lt;/li&gt;
    &lt;li id=&quot;DoX2&quot;&gt;Добавляется ваш приватный ключ как второй аккаунт для подключения к крану Story.&lt;/li&gt;
    &lt;li id=&quot;xnIO&quot;&gt;Добавляется тестовая сеть.&lt;/li&gt;
    &lt;li id=&quot;CCBm&quot;&gt;Переход на сайт с краном.&lt;/li&gt;
    &lt;li id=&quot;aQY9&quot;&gt;Автоматическое прохождение CAPTCHA от Cloudflare.&lt;/li&gt;
    &lt;li id=&quot;4Rfn&quot;&gt;Кошелёк добавляется на сайт.&lt;/li&gt;
    &lt;li id=&quot;eQri&quot;&gt;Выполняется клейм одного IP.&lt;/li&gt;
    &lt;li id=&quot;8ZSi&quot;&gt;Закрывается браузер.&lt;/li&gt;
    &lt;li id=&quot;9Y0C&quot;&gt;Процесс повторяется для следующего кошелька.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;EHtU&quot;&gt;Также автоматически ведётся запись логов в файл &lt;code&gt;log.txt&lt;/code&gt; после запуска кода. Логи необходимы для анализа ошибок — вы сможете увидеть, когда и на каком этапе произошла ошибка, а также какой кошелёк использовался.&lt;/p&gt;
  &lt;h2 id=&quot;YipX&quot;&gt;Подготовка кода к запуску&lt;/h2&gt;
  &lt;p id=&quot;UbSU&quot;&gt;1) Создайте папку для проекта StoryFaucet&lt;/p&gt;
  &lt;p id=&quot;wAvb&quot;&gt;2) Откройте папку в Visual Studio Code,запустите терминал и клонируйте репозиторий с помощью команды:&lt;/p&gt;
  &lt;pre id=&quot;T5q3&quot;&gt;git clone https://github.com/Pastfin/StoryFaucet.git .&lt;/pre&gt;
  &lt;p id=&quot;fR1p&quot;&gt;В результате вы получите следующие файлы:&lt;/p&gt;
  &lt;figure id=&quot;Z7F0&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6f/dd/6fdd2111-f1f4-446e-a0af-be07d1217a85.png&quot; width=&quot;248&quot; /&gt;
  &lt;/figure&gt;
  &lt;blockquote id=&quot;C294&quot;&gt;&lt;strong&gt;index.js&lt;/strong&gt; — основной код, который будет запускаться.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;SKIz&quot;&gt;&lt;strong&gt;metamask.js&lt;/strong&gt; — работа с MetaMask.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;cZAf&quot;&gt;&lt;strong&gt;helpers.js&lt;/strong&gt; — вспомогательные функции, чтобы сделать основной код более чистым.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;S1bJ&quot;&gt;&lt;strong&gt;package-lock.json; package.json&lt;/strong&gt; — файлы зависимостей с версиями библиотек.&lt;/blockquote&gt;
  &lt;blockquote id=&quot;oIA1&quot;&gt;&lt;strong&gt;wallets.xlsx&lt;/strong&gt; — Excel-файл, в который нужно записать кошельки для крана. Столбцы: публичный ключ, приватный ключ, прокси (опционально), комментарий (только для вас, не используется в коде). Приватный ключ используется только при добавлении кошелька в MetaMask.&lt;/blockquote&gt;
  &lt;p id=&quot;Lwb2&quot;&gt;3) Установите библиотеки. Для этого в терминале, находясь в папке проекта, выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;p59k&quot;&gt;npm install&lt;/pre&gt;
  &lt;p id=&quot;DNDj&quot;&gt;После выполнения команды должна появиться папка &lt;code&gt;node_modules&lt;/code&gt;. Это означает, что все зависимости были установлены успешно.&lt;/p&gt;
  &lt;p id=&quot;kFRo&quot;&gt;4) Добавьте расширение MetaMask в проект. Так как в коде используется MetaMask, необходимо добавить расширение в папку с проектом. Лучше всего сделать это на новом профиле Chrome.&lt;/p&gt;
  &lt;ul id=&quot;vYhw&quot;&gt;
    &lt;li id=&quot;xKCG&quot;&gt;Создайте новый профиль в браузере Chrome.&lt;/li&gt;
    &lt;li id=&quot;owjx&quot;&gt;Установите MetaMask на новый профиль (настраивать кошелёк не нужно): &lt;a href=&quot;https://chromewebstore.google.com/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn&quot; target=&quot;_blank&quot;&gt;MetaMask в Chrome&lt;/a&gt;.&lt;/li&gt;
    &lt;li id=&quot;oeaS&quot;&gt;Затем откройте новую вкладку в Chrome и перейдите на &lt;code&gt;chrome://version&lt;/code&gt;. Скопируйте путь к профилю, он будет выглядеть примерно так: &lt;code&gt;...\AppData\Local\Google\Chrome\User Data\Profile {n}&lt;/code&gt;.&lt;/li&gt;
    &lt;li id=&quot;h5ZE&quot;&gt;Откройте этот путь в проводнике и перейдите в папку &lt;code&gt;Extensions&lt;/code&gt;, затем откройте папку с MetaMask(&lt;code&gt;nkbihfbeogaeaoehlefnkodbefgpgknn&lt;/code&gt;).&lt;/li&gt;
    &lt;li id=&quot;fXCK&quot;&gt;Скопируйте папку версии расширения&lt;code&gt;12.3.1_0&lt;/code&gt; и вставьте её в папку с проектом.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p id=&quot;g27p&quot;&gt;В результате, структура папки проекта должна выглядеть следующим образом:&lt;/p&gt;
  &lt;figure id=&quot;SXDq&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/d3/0ad3b293-8b86-4330-ac42-981fd5bb6c18.png&quot; width=&quot;278&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;Pkm9&quot;&gt;
    &lt;li id=&quot;PE2w&quot;&gt;Заполните файл wallets.xlsx. Для тестирования можете добавить от 2 до 4 кошельков. Формат прокси: &lt;code&gt;{IP}:{Port}:{username}:{password}&lt;/code&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2 id=&quot;jvFF&quot;&gt;Запуск кода&lt;/h2&gt;
  &lt;p id=&quot;OxtC&quot;&gt;1) Откройте терминал в папке с кодом.&lt;/p&gt;
  &lt;p id=&quot;dhbe&quot;&gt;2) Выполните команду:&lt;/p&gt;
  &lt;pre id=&quot;G0xs&quot;&gt;node index.js&lt;/pre&gt;
  &lt;p id=&quot;VYyk&quot;&gt;3) Кайфуем&lt;/p&gt;
  &lt;h3 id=&quot;xrrB&quot;&gt;Возможные трудности&lt;/h3&gt;
  &lt;ul id=&quot;xhl6&quot;&gt;
    &lt;li id=&quot;3lNc&quot;&gt;Если изменилась версия Metamask и уже не 12.3.1_0, то надо поставить новую версию в файле &lt;code&gt;index.js&lt;/code&gt;:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;figure id=&quot;EvgO&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/f1/a9/f1a9dd2a-c4a8-4bdc-b659-8ab24518e786.png&quot; width=&quot;381.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;ul id=&quot;rRpj&quot;&gt;
    &lt;li id=&quot;e8PT&quot;&gt;Возникают ошибки из-за слабого компьютера или медленного интернета.&lt;br /&gt;В таком случае найдите строки с ожиданием в коде и увеличьте тайминг. Например, ожидание в &lt;strong&gt;5,5 секунд&lt;/strong&gt; выглядит так:&lt;/li&gt;
  &lt;/ul&gt;
  &lt;pre id=&quot;U6y6&quot;&gt;await new Promise(resolve =&amp;gt; setTimeout(resolve, 5500));&lt;/pre&gt;
  &lt;ul id=&quot;LCUF&quot;&gt;
    &lt;li id=&quot;hZaa&quot;&gt;Не работает Node или Git. Проблема может заключаться в том, что не добавлены переменные в &lt;code&gt;Path&lt;/code&gt; или вы не перезагрузили терминал (&lt;code&gt;cmd&lt;/code&gt;/&lt;code&gt;VSC&lt;/code&gt;) для применения последних изменений в &lt;code&gt;Path&lt;/code&gt;. Исправить это можно в меню &amp;quot;Edit environment variables&amp;quot; / &amp;quot;Изменение переменных среды&amp;quot;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;VoA0&quot;&gt;Видео с работой кода и описанием того, как удалось обойти гитпаспорт, находится в моем тг канале: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;

</content></entry><entry><id>pastfin:HAHtRQ6krec</id><link rel="alternate" type="text/html" href="https://teletype.in/@pastfin/HAHtRQ6krec?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=pastfin"></link><title>Сетапим массово ноды Elixir</title><published>2024-09-19T23:15:29.738Z</published><updated>2024-10-02T17:39:14.108Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img3.teletype.in/files/ae/f5/aef5d37a-c103-45c4-93ad-f1c4409b9b75.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://img1.teletype.in/files/0a/27/0a27e85f-09f8-42e2-a162-7c1ad5009262.png&quot;&gt;Канал в тг: https://t.me/PastFinCoding</summary><content type="html">
  &lt;p id=&quot;Ry9M&quot;&gt;Канал в тг: &lt;a href=&quot;https://t.me/PastFinCoding&quot; target=&quot;_blank&quot;&gt;https://t.me/PastFinCoding&lt;/a&gt;&lt;/p&gt;
  &lt;h2 id=&quot;OBSB&quot;&gt;Предисловие&lt;/h2&gt;
  &lt;p id=&quot;tRzF&quot;&gt;Результативности от моего решения пока нет, потому что то дашборд лагает, то сервера падают из-за перегруза. Хочу просто поделиться тем, какую работу проделал, а выводы будут сделаны потом. &lt;/p&gt;
  &lt;p id=&quot;70Vt&quot;&gt;Мое текущее состояние:&lt;/p&gt;
  &lt;ol id=&quot;6nIQ&quot;&gt;
    &lt;li id=&quot;u0UP&quot;&gt;Сейчас у меня работает 110 нод. То есть 110 кошельков валидаторов и 110 кошельков делегаторов, суммарно 220 кошельков задействовано. Есть несколько опций:&lt;/li&gt;
    &lt;ul id=&quot;dAbu&quot;&gt;
      &lt;li id=&quot;PNKo&quot;&gt;Один валидатор, несколько делегаторов.&lt;/li&gt;
      &lt;li id=&quot;6gTJ&quot;&gt;Один валидатор, один делегатор. Это проще.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;BTlj&quot;&gt;Серверы на мою последнюю не регнутую карту:&lt;/li&gt;
    &lt;ul id=&quot;SZbw&quot;&gt;
      &lt;li id=&quot;P23A&quot;&gt;4 сервера на Digital Ocean. Я получил фришные 200$ на два месяца.&lt;/li&gt;
      &lt;li id=&quot;DI3q&quot;&gt;1 сервер на Google Console. Я получил фришные 300$ на три месяца.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;KClL&quot;&gt;Концепция&lt;/h2&gt;
  &lt;p id=&quot;rjvg&quot;&gt;Ноды проектов работают следующим образом:&lt;/p&gt;
  &lt;ol id=&quot;0VPo&quot;&gt;
    &lt;li id=&quot;lDpA&quot;&gt;Есть минимальные требования к серверу&lt;/li&gt;
    &lt;li id=&quot;MRFy&quot;&gt;Один сервер - одна нода&lt;/li&gt;
    &lt;li id=&quot;kc3t&quot;&gt;Когда появляется работа, ваша нода случайным образом может попасть в пул воркеров. Соответственно, чем больше у вас нод, тем выше попасть в пул воркеров и заработать награду.&lt;/li&gt;
    &lt;li id=&quot;Fcn9&quot;&gt;В тестнетах обычно меньше нагрузка и могут выдать бейс дроп, даже если ваша нода не так много решила задач.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;e7uF&quot;&gt;Моя задача заключалась в том, чтобы автоматизированным путем засетапить большое количество нод, не переходя к сильному ручному труду. &lt;/p&gt;
  &lt;p id=&quot;hhBt&quot;&gt;UPD: все равно приходится много вещей контролировать и долго писал код.&lt;/p&gt;
  &lt;p id=&quot;I9r4&quot;&gt;Верхнеуровнево логика моего кода следующая:&lt;/p&gt;
  &lt;ol id=&quot;E2Mb&quot;&gt;
    &lt;li id=&quot;q7E8&quot;&gt;Сетаплю сервер&lt;/li&gt;
    &lt;li id=&quot;LX46&quot;&gt;Устанавливаю на него Docker&lt;/li&gt;
    &lt;li id=&quot;0TKN&quot;&gt;Создаю на нем Docker файл, в image которого прописано, чтобы контейнер содержал Docker. То есть концепция докер в докере.&lt;/li&gt;
    &lt;li id=&quot;5xmP&quot;&gt;Внутри контейнера с докером я ставлю контейнер с нодой, которая не знает про существование других контейнеров.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;v4QS&quot;&gt;Таким образом получается запустить сразу много нод внутри одного сервера.&lt;/p&gt;
  &lt;h2 id=&quot;4IwD&quot;&gt; Проблематика&lt;/h2&gt;
  &lt;ol id=&quot;2vEA&quot;&gt;
    &lt;li id=&quot;Qqyv&quot;&gt;Когда внутри одного сервера запускается сразу множество нод, достаточно сложно посчитать оптимальную нагрузку, чтобы сервер не отрубился или не выдавал низкий uptime на Elixir. Всё проходится экспериментальным путем, но пересетапливать достаточно сложно. Если сервер перегружается, то это нарушает работу других нод. То есть условно при условии, когда у вас одновременно начнет работать n нод, то ваш сервер отлетит. Как это вычислить? Я вообще не представляю.&lt;/li&gt;
    &lt;li id=&quot;Dqq6&quot;&gt;Сайт Elixir я не понимаю как рассчитывает награды, потому что админы пишут, что это экспериментальный не конечный подсчет, хотя на моих на всех нодах ноль наград, но в чате я видел, что людям дают.&lt;/li&gt;
    &lt;li id=&quot;GwDk&quot;&gt;Когда выходит новая версия ноды, приходится их всех перезапускать, это долго.&lt;/li&gt;
    &lt;li id=&quot;ucJv&quot;&gt;Требуется неплохое знание программирования, чтобы самому такую логику построить.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h2 id=&quot;v13q&quot;&gt;Погружаемся в задачу&lt;/h2&gt;
  &lt;figure id=&quot;VOH2&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/0a/27/0a27e85f-09f8-42e2-a162-7c1ad5009262.png&quot; width=&quot;835.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;hnOM&quot;&gt;Сторона делегатора&lt;/h3&gt;
  &lt;ol id=&quot;r2z4&quot;&gt;
    &lt;li id=&quot;aGyI&quot;&gt;На кошельке делегатора должен лежать Sepoila ETH.&lt;/li&gt;
    &lt;li id=&quot;nXbw&quot;&gt;Нужно зайти на сайт элексира, заминтить $MOCK (внутренний токен для делегация, PoS логика).&lt;/li&gt;
    &lt;li id=&quot;Tdtd&quot;&gt;Выбрать валидатора, то есть привязать кошелек ноды.&lt;/li&gt;
    &lt;li id=&quot;nZia&quot;&gt;Застейкать заминченный $MOCK, чтобы передать валидатору.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;0tEB&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;wZqd&quot;&gt;Для того, чтобы на кошельке делегатора появился Sepoila ETH я придумал следующую схему:&lt;/p&gt;
  &lt;ol id=&quot;gm5Z&quot;&gt;
    &lt;li id=&quot;x2wV&quot;&gt;Я создаю большое количество пустых кошельков&lt;/li&gt;
    &lt;li id=&quot;VG1L&quot;&gt;Я распределяю кошельки как:&lt;/li&gt;
    &lt;ul id=&quot;YMla&quot;&gt;
      &lt;li id=&quot;B5cR&quot;&gt;Level 1&lt;/li&gt;
      &lt;li id=&quot;Jh6a&quot;&gt;Level 2&lt;/li&gt;
      &lt;li id=&quot;WEu3&quot;&gt;Level 3&lt;/li&gt;
      &lt;li id=&quot;SU7O&quot;&gt;Final&lt;/li&gt;
      &lt;li id=&quot;Y2VN&quot;&gt;Node&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li id=&quot;zrg3&quot;&gt;Я наливаю Sepoila ETH через все возможные краны на один кошелек, это достаточно сложная задача. При этом кошелек я создал пустой и перевел на него 10$ ETH, потому что иначе сайты не дадут налить. После агрегации на одном кошельке Sepoila ETH, я последовательно перевожу с одного кошелька на Level 1 (на 110 кошельков в моем случае), далее на Level 2, далее на Level 3, далее на Final. Соответственно при повторной транзакции у меня в таблице все зафиксировано, то есть путь будет всегда одинаковый у раскида Sepoila ETH. Я это делаю для безопасности от бана по сибилу, хотя может тупо выглядеть, однако мне показало норм идеей. Лучше, чем с одного кошелька раскидывать на 110 пустых кошельков. Еще раз: первый кошелек из ряда Level 1 переводит средства первому кошельку из ряда Level 2, и так до Final. По итогу кошельки между собой никак не пересекаются.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;7iJA&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;UREV&quot;&gt;Что касается интерактива с сайтом Elixir:&lt;/p&gt;
  &lt;ol id=&quot;ooZa&quot;&gt;
    &lt;li id=&quot;WGQs&quot;&gt;С самим сайтом я никак не взаимодействую, я украл только код транзакций, которые надо отправлять в блокчейн. Было не так сложно, однако не с первого раза.&lt;/li&gt;
    &lt;li id=&quot;40fj&quot;&gt;Можно минтить за один раз только 1000 $MOCK, но я написал логику, которая циклом может минтить большое количество и необязательно делать это сразу в первый раз. Можно через неделю еще наминтить и делегировать.&lt;/li&gt;
    &lt;li id=&quot;T6Hk&quot;&gt;В дискорде писали, что количество MOCK не сильно влияет на выбор ноды и там применена логика нормализации. Но я знаю че такое нормализация, поэтому вес все равно имеет. Я бы сказал что 50-60к MOCK достаточно.&lt;/li&gt;
    &lt;li id=&quot;uGnP&quot;&gt;Адекватно чтобы код работал и подписывал транзы только ночью. Нормальный gwei в сети Sepoila ETH ~0.3 gwei.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;h3 id=&quot;8Hsn&quot;&gt;Сторона валидатора&lt;/h3&gt;
  &lt;p id=&quot;CG4C&quot;&gt;Всё написано в разборке кода про валидатора, основная сложность найти баланс между потреблением ноды и сервера.&lt;/p&gt;
  &lt;h2 id=&quot;75qm&quot;&gt;Разборка кода&lt;/h2&gt;
  &lt;h2 id=&quot;tDSC&quot;&gt;Делегатор&lt;/h2&gt;
  &lt;h3 id=&quot;61MK&quot;&gt;Распределение кошельков&lt;/h3&gt;
  &lt;p id=&quot;aEhC&quot;&gt;Изначально у вас должен быть Excel файлик с двумя колонками: public_key, private_key. Назовите его как &amp;quot;original_wallets.xlsx&amp;quot;. Из этого файлика мы и будем генерить сплит.&lt;/p&gt;
  &lt;p id=&quot;iXXD&quot;&gt;Если вам надо 100 нод, то в файле должно быть 500 кошельков.&lt;/p&gt;
  &lt;p id=&quot;yr7N&quot;&gt;Также для следующего этапа в файле &amp;quot;original_wallets.xlsx&amp;quot; должен быть кошелек для агрегации Sepoila ETH, который не попадет в распределение. Сделайте не n кошельков, а n + 1, последним кошель агрегатор. Потому что в следующем этапе криво код написан и лень исправлять.&lt;/p&gt;
  &lt;p id=&quot;eX2R&quot;&gt;Вот здесь указывать сколько у вас в конечном итоге будет нод.&lt;/p&gt;
  &lt;figure id=&quot;60AD&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img2.teletype.in/files/53/05/5305b545-7f71-445c-a860-dc14a51fbe83.png&quot; width=&quot;247&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;4rzy&quot;&gt;Код для разбивки кошельков: &lt;a href=&quot;https://gist.github.com/Pastfin/ade7958193b442f3f8ff0ca0198c83ac&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/Pastfin/ade7958193b442f3f8ff0ca0198c83ac&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;TN5j&quot;&gt;Output должен быть следующим:&lt;/p&gt;
  &lt;figure id=&quot;cVb7&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/74/20/7420a7df-fdc7-4ab3-aeff-2d19091b00f5.png&quot; width=&quot;784.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;h3 id=&quot;iI7B&quot;&gt;Наливаем Sepoila ETH на первый кошелек агрегатор&lt;/h3&gt;
  &lt;ol id=&quot;WB2B&quot;&gt;
    &lt;li id=&quot;FQKV&quot;&gt;&lt;a href=&quot;https://cloud.google.com/application/web3/faucet/ethereum/sepolia&quot; target=&quot;_blank&quot;&gt;https://cloud.google.com/application/web3/faucet/ethereum/sepolia&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;dNhg&quot;&gt;&lt;a href=&quot;https://www.alchemy.com/faucets/ethereum-sepolia&quot; target=&quot;_blank&quot;&gt;https://www.alchemy.com/faucets/ethereum-sepolia&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;yd8G&quot;&gt;&lt;a href=&quot;https://faucets.chain.link/sepolia&quot; target=&quot;_blank&quot;&gt;https://faucets.chain.link/sepolia&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;Srao&quot;&gt;&lt;a href=&quot;https://getblock.io/faucet/eth-sepolia/&quot; target=&quot;_blank&quot;&gt;https://getblock.io/faucet/eth-sepolia/&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Y7GZ&quot;&gt;Регаемся там и наливаем, на кошельке должно быть хотя бы 10$ в ETH, лучше 20$ в ETH сразу кинуть.&lt;/p&gt;
  &lt;h3 id=&quot;EP9Q&quot;&gt;Раскид с первого кошелька до Final&lt;/h3&gt;
  &lt;p id=&quot;4qFr&quot;&gt;Теперь задача в том, чтобы докинуть Sepoila до Final. Я советую, чтобы на конечном кошельке было хотя бы 0.01 ETH. Сами посчитаете сколько надо налить на ваше количество нод. Учитывайте газ.&lt;/p&gt;
  &lt;p id=&quot;xwka&quot;&gt;Код для раскида: &lt;a href=&quot;https://gist.github.com/Pastfin/dff526b1afe1d2ab33571175a616eb81&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/Pastfin/dff526b1afe1d2ab33571175a616eb81&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;3szV&quot;&gt;Вот тут выставляется сколько вы хотите отправлять на каждый кошель.&lt;/p&gt;
  &lt;figure id=&quot;LqPp&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/35/1c/351c25cf-e22d-4a6b-8673-a5671e4af65d.png&quot; width=&quot;394&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;8D0I&quot;&gt;Раскид происходит долго, но думаю, что код можно улучшить.&lt;/p&gt;
  &lt;h3 id=&quot;Wb6A&quot;&gt;Взаимодействие с контрактом для минтинга и делегации&lt;/h3&gt;
  &lt;p id=&quot;Dm54&quot;&gt;Процесс:&lt;/p&gt;
  &lt;ol id=&quot;2fB6&quot;&gt;
    &lt;li id=&quot;aXXG&quot;&gt;Минтинг, выставляется рендж сколько вы хотите. Если много Sepoila ETH, то ставьте 40-50, если мало, то 3-5 тоже норм, потом дольете (строка в коде 172). &lt;/li&gt;
    &lt;li id=&quot;tZVc&quot;&gt;approve_mock_for_staking&lt;/li&gt;
    &lt;li id=&quot;B8pS&quot;&gt;stake&lt;/li&gt;
    &lt;li id=&quot;f3FU&quot;&gt;is_already_delegated проверка. Это чтобы потом доливать стейкинг&lt;/li&gt;
    &lt;li id=&quot;A8XZ&quot;&gt;delegate если в 4 пункте False.&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;JGuA&quot;&gt;Код: &lt;a href=&quot;https://gist.github.com/Pastfin/f8f6b154416c897a4c7d777a385bb5bb&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/Pastfin/f8f6b154416c897a4c7d777a385bb5bb&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;c5lx&quot;&gt;После выполнения кода работа со стороны валидатора окончена.&lt;/p&gt;
  &lt;h2 id=&quot;arxT&quot;&gt;Валидатор&lt;/h2&gt;
  &lt;h3 id=&quot;hnlx&quot;&gt;Настройка серверов&lt;/h3&gt;
  &lt;p id=&quot;OlXG&quot;&gt;Вот такие сервера я беру на Digital Ocean:&lt;/p&gt;
  &lt;figure id=&quot;R2ho&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img4.teletype.in/files/7a/97/7a97c10a-8a17-4a53-b75a-3c97af2ab698.png&quot; width=&quot;614.5&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;KAcA&quot;&gt;Для работы с серверами я использую VSC и расширение Remote Explorer, удобнее ничего не существует. После добавления и подключения прописываем следующие команды:&lt;/p&gt;
  &lt;pre id=&quot;fH4K&quot;&gt; sudo apt update
 sudo apt-get install ca-certificates curl
 sudo install -m 0755 -d /etc/apt/keyrings 
 sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
 sudo chmod a+r /etc/apt/keyrings/docker.asc
 
 echo \ &amp;quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;quot;$VERSION_CODENAME&amp;quot;) stable&amp;quot; | \ sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
 
 sudo apt-get update
 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 
 sudo apt install python3 python3-venv python3-pip
 python3 -m venv myenv
 source myenv/bin/activate
 
 pip install pandas
 pip install openpyxl&lt;/pre&gt;
  &lt;p id=&quot;OfpU&quot;&gt;Во время установки на все соглашаемся. Выполнять команды последовательно построчно. Это установка докера + установка питона с созданием окружающей среды.&lt;/p&gt;
  &lt;p id=&quot;V3JZ&quot;&gt;Далее обычно через VSC я переношу на сервер целую папку под названием elixir, которая состоит из следующих файлов:&lt;/p&gt;
  &lt;ol id=&quot;Fdwr&quot;&gt;
    &lt;li id=&quot;aRR7&quot;&gt;env_files папка, про нее немного позже&lt;/li&gt;
    &lt;li id=&quot;33zy&quot;&gt;Dockerfile&lt;/li&gt;
    &lt;li id=&quot;oNV1&quot;&gt;enf_file_generator.py&lt;/li&gt;
    &lt;li id=&quot;Hu1J&quot;&gt;run_dockers.py&lt;/li&gt;
    &lt;li id=&quot;gmgF&quot;&gt;wallets_splitted.xlsx&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;Jyzk&quot;&gt;Начнем с питоновских скриптов:&lt;/p&gt;
  &lt;p id=&quot;uEmc&quot;&gt;enf_file_generator.py - необходим для того, чтобы создавать в папку env_files файлы, которые позволяют ноде Элексира получать информацию про валидатора и бенефициара. То есть в этом файле указывается публичный ключ бенефециара от фарма, приватный ключ валидатора и никнейм валидатора, генерируется у меня в коде автоматически&lt;/p&gt;
  &lt;p id=&quot;5JUO&quot;&gt;Все файлы создаются автоматически и потом автоматически переносятся в контейнер, пример файла:&lt;/p&gt;
  &lt;figure id=&quot;KayF&quot; class=&quot;m_retina&quot;&gt;
    &lt;img src=&quot;https://img1.teletype.in/files/00/f1/00f106f7-1bd6-4531-8aaa-86d89181dccb.png&quot; width=&quot;439&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;12SQ&quot;&gt;Код enf_file_generator.py: &lt;a href=&quot;https://gist.github.com/Pastfin/4006df549d287a450e4db5a3a060f062&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/Pastfin/4006df549d287a450e4db5a3a060f062&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;rp0e&quot;&gt;В 49 строке необходимо указать количество сколько у вас кошельков, чтобы сгенерировать нужное количество файлов.&lt;/p&gt;
  &lt;p id=&quot;dM4g&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;jxd7&quot;&gt;run_dockers.py - необходим для запуска последовательно контейнеров. Важно контролировать в 84 строке сколько нод вы запускаете. Например, если первые 20 и это ваш первый сервер, то for x in range(20). Если это второй сервер, то for x in range(20, 40). Файл wallets_splitted.xlsx должен быть статичен на всех серверах, чтобы не сбить последовательность.&lt;/p&gt;
  &lt;p id=&quot;68sJ&quot;&gt;Код run_dockers.py: &lt;a href=&quot;https://gist.github.com/Pastfin/51a12b3679c1a75b778afd65837ee708&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/Pastfin/51a12b3679c1a75b778afd65837ee708&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;eEgT&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;xCcb&quot;&gt;Теперь перейдем к Dockerfile, вот код: &lt;a href=&quot;https://gist.github.com/Pastfin/63b182361c2d8f129d6953064a497b42&quot; target=&quot;_blank&quot;&gt;https://gist.github.com/Pastfin/63b182361c2d8f129d6953064a497b42&lt;/a&gt;&lt;/p&gt;
  &lt;p id=&quot;bvek&quot;&gt;Этот докерфайл позволяет создавать докер в докере.&lt;/p&gt;
  &lt;p id=&quot;GUcj&quot;&gt;&lt;/p&gt;
  &lt;p id=&quot;nqDY&quot;&gt;После того, как мы создали и заполнили папку всем необходим, должно получиться так:&lt;/p&gt;
  &lt;figure id=&quot;JJln&quot; class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://img3.teletype.in/files/6c/ae/6cae0819-5bab-4e25-b773-e88cb5572ee5.png&quot; width=&quot;329&quot; /&gt;
  &lt;/figure&gt;
  &lt;p id=&quot;3UmE&quot;&gt;Далее код в терминале:&lt;/p&gt;
  &lt;ol id=&quot;fDaV&quot;&gt;
    &lt;li id=&quot;mtY3&quot;&gt;cd elixir&lt;/li&gt;
    &lt;li id=&quot;7xfI&quot;&gt;python env_file_generator.py&lt;/li&gt;
    &lt;li id=&quot;0VDq&quot;&gt;docker build -t elixir .&lt;/li&gt;
    &lt;li id=&quot;zlFQ&quot;&gt;python run_dockers.py&lt;/li&gt;
  &lt;/ol&gt;
  &lt;p id=&quot;DvZj&quot;&gt;Все, после этого контейнеры сами начнут создаваться, где автоматически будет устанавливаться нода Элексира и сразу подключаться валидатор. Спустя 5 мин вы сможете увидеть в дашборде результат.&lt;/p&gt;
  &lt;p id=&quot;xrJY&quot;&gt;Если вы перегрузите сервер, то он перестанет заходить и вам заблочат акк на Digital Ocean. 20 нод - норма (но еще тестирую).&lt;/p&gt;
  &lt;h3 id=&quot;Lyg6&quot;&gt;Всякие последние команды на последок&lt;/h3&gt;
  &lt;p id=&quot;ryYL&quot;&gt;Полная очистка докера:&lt;/p&gt;
  &lt;pre id=&quot;yKiE&quot;&gt;docker stop $(docker ps -q) 
docker rm $(docker ps -a -q) 
docker rmi $(docker images -q) --force 
docker volume prune -f 
docker network prune -f 
docker system prune -a --volumes -f&lt;/pre&gt;
  &lt;p id=&quot;FHre&quot;&gt;Проверка ssd памяти на серваке:&lt;/p&gt;
  &lt;pre id=&quot;VRlj&quot;&gt;df -h&lt;/pre&gt;
  &lt;p id=&quot;zgOr&quot;&gt;Проверка потребления ресурсов на серваке:&lt;/p&gt;
  &lt;pre id=&quot;U6Kd&quot;&gt;htop&lt;/pre&gt;
  &lt;p id=&quot;VDq4&quot;&gt;Проверка логов ноды:&lt;/p&gt;
  &lt;pre id=&quot;bUbY&quot;&gt;docker ps
docker exec -it {container_id or container_name} /bin/bash
docker elixir logs -f&lt;/pre&gt;
  &lt;hr /&gt;
  &lt;p id=&quot;cnTR&quot;&gt;Всем спасибо, все свободны.&lt;/p&gt;

</content></entry></feed>