# PerpLand

{% hint style="success" %}
Совместимость: Windows, MacOS, Linux
{% endhint %}

## 📚 Описание проекта

**Perp DEX** - новый тренд в крипте с фармом поинтов на большом количестве разных площадок со фьючерсами. Наш софт помогает открывать зеркальные позиции, накручивать объемы и экономить огромное количество сил и времени при отработке.

Затраты:

* **Backpack 1 acc:** 400-500$ acc
* **Paradex 1 acc:** 400-500$ acc
* **Hyperliquid 1 acc:** 200$-300$ acc&#x20;
* **Lighter 1 acc:** 40$ acc
* **Aster 1 acc:** any size&#x20;
* **Edgex 1 acc**: any size
* **Extended 1 acc**: any size
* **Ethereal 1 acc**: any size
* **Nado 1 acc**: any size&#x20;

Ожидаемый профит:

* **Paradex:** x3-4 к затратам
* **Hyperliquid:** x3-4 к затратам
* **Pacifica:** x3-4 к затратам
* **Backpack:** x2 к затратам
* **Edgex**: x3 к затратам
* **Extended**: x5 к затратам
* **Ethereal**: x8 к затратам
* **Nado:** x3-4 к затратам

Завершенные:

* Aster: x1-x1.1 к затратам
* Lighter: x45 к затратам

{% hint style="info" %}
Подробное описание проектов в этом посте: [ТЫК](https://t.me/blacktaraxacum/3621)
{% endhint %}

***

## 🚀 Доступные в софте активности

<details>

<summary>Поддерживаемые Perp</summary>

* Поддерживается 8 проектов: [Edgex](https://pro.edgex.exchange/referral/ODUVANCHIK), [Extended](https://app.extended.exchange/join/ODUVANCHIK), [Backpack](https://backpack.exchange/refer/bf0da9cf-b0c3-4500-9fc2-c9663002b38f), [Lighter](https://lighter.xyz/), [Paradex](https://app.paradex.trade/r/oduvanchik), [Hyperliquid](https://app.hyperliquid.xyz/join/ODUVANCHIK), [Aster](https://www.asterdex.com/en/referral/581c65), [Pacifica](https://app.pacifica.fi/?referral=oduvanchik), [Ethereal](https://app.ethereal.trade/?ref=TNIB5X6BEAET)
* Возможно использовать любые связки бирж из доступных. \
  Например: Backpack + Lighter, Hyperliquid + Paradex, Lighter + Paradex и тд
* Хеджирование Lighter + Lighter + Lighter/Backpack +Backpack +Backpack /Paradex+Paradex+Paradex (стратегия с 3 аккаунтами)

</details>

<details>

<summary>Объемы</summary>

* Автоматический или ручной подбор аккаунтов
* Зеркальное открытие лимитных ордеров на двух биржах
* Закрытие всех позиций отдельной функцией
* Возможность ожидания положительного спреда для закрытия позиций в плюс по PNL
* Статистика по аккаунтам и позициям &#x20;

</details>

#### **Особенности**

* Бот проверяет баланс на двух запущенных аккаунтах и берет в работу ту сумму, где баланс меньше
* Работа с DEX через WebSocket для высокой производительности и минимальной задержки
* Хедж-стратегии с учётом спредов и фандинга
* Защитные механизмы — автоматическое закрытие позиций при фатальных ошибках и ликвидациях
* Детальная статистика с учетом всех реальных доходов и потерь (комиссии, фандинг, неудачные позиции и т.д.)
* Выбор стратегий, включая те, что оптимизированы под конкретные пары и биржи
* Возможность комбинировать любые поддерживаемые DEX'ы между собой
* **Комьюнити** для отслеживания новых вариантов отработки проекта и внедрение этого в софт

{% hint style="info" %}
За дальнейшими обновлениями можно следить в нашем паблике: <https://t.me/oxygen_tools>
{% endhint %}

***

## ⚙️ Установка

#### **Требования:**

* Установка Node Js: <https://nodejs.org/>

#### **Скачивание:**

1. Перейти в нашего бота: <https://t.me/OduLandBot?start=r_oxygen_x>
2. Личный кабинет -> Доступ к софтам -> Выбрать интересующий вас продукт

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FkCMAk5SVTUySYflhdno0%2F05182-ezgif.com-video-to-gif-converter.gif?alt=media&#x26;token=8b090cc5-d5c0-4cd5-9f23-cb0d1b37a21e" alt=""><figcaption><p> Скачивание продукта</p></figcaption></figure>

***

## ▶ Первый запуск

1. Разархивируйте софт в удобное для вас место на вашем ПК
2. Запуск производится через .exe файл в корне с софтом. После первого запуска в директории появятся все нужные файлы конфигов
3. Настройте данные для запуска:

* Заполните файлы с данными от аккаунтов (форматы данных будут расписаны ниже)
* Установите оптимальные настройки под ваши требования в config.json

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FOK78gW0SUsDaupgXKvMI%2FPerpLand%20Setup.gif?alt=media&#x26;token=2f2c9657-8a0c-4b8c-990e-ff7fab97e24a" alt=""><figcaption><p>Запуск софта</p></figcaption></figure>

***

## ✅ Настройка и начало работы

{% hint style="info" %}
**Гайд по созданию .txt с аккаунтами:**

[sozdanie-faila-s-dannymi](https://tools.oxygen.wiki/docs/soft/gaidy/sozdanie-faila-s-dannymi "mention")
{% endhint %}

{% hint style="warning" %}
**Формат прокси**

`host`:`port`:`username`:`password`
{% endhint %}

### Настройки Backpack

#### :file\_folder: config/backpack/accounts.txt

Формат - `label,apiKey,apiSecret,proxy`

`label` - обязательная метка для обозначения аккаунта\
`apiKey` - API ключ аккаунта для доступа к открытию позиций\
`apiSecret` - API секретная фраза для доступа к открытию позиций\
`proxy` - прокси аккаунта

Как получить `apiKey` и `apiSecret`:

1. Зайдите в свой аккаунт Backpack
2. Перейдите в портфолио
3. Внизу нажмите Settings
4. Выберите вкладку API Keys
5. Нажмите на кнопку New API key

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2F9fAPEznRVulh3pgU8aUl%2Fimage.png?alt=media&#x26;token=6e07b840-975c-45b9-9bea-f723654427fe" alt=""><figcaption><p>Создание apiKey + apiSecret</p></figcaption></figure>

***

### Настройки Lighter

#### :file\_folder: config/lighter/accounts.tx

Формат - `label,seed,l1Address,index,proxy`

`label` - обязательная метка для обозначения аккаунта\
`seed` - сид аккаунта из консоли\
`l1Address` - адрес привязанного EVM-кошелька\
`index` - индекс аккаунта из консоли\
`proxy` - прокси аккаунта

Как получить `seed` и `index`:

1. Зайдите в свой аккаунт Lighter через браузер
2. Откройте консоль разработчика (нажмите F12)
3. Вставьте команду ниже и нажмите Enter
4. `seed` и `index` появятся в логах, их можно скопировать

```javascript
const [index, obj] = Object.entries(JSON.parse(localStorage.getItem('signature_v5')))[0];
console.log('index:', index);
console.log('seed:', obj.seed);
```

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FGlqksDTc8Q6PpOhGaN6I%2FUDei1K6u9c.png?alt=media&#x26;token=69428bfc-f10d-4810-8c8d-381a34268fb1" alt=""><figcaption><p>Получение Index + Seed (F12 -> Console -> Снизу вставляем код и нажимаем Enter)</p></figcaption></figure>

#### :file\_folder: config/lighter\_config.json

`slippage` - проскальзывание, используемое при открытии позиций

`wasm_link` - актуальная ссылка lighter приложения, может обновляться при апдейтах от команды.

Как найти `wasm_link`:

1. Нажмите F12 и обновите страницу
2. Перейдите во вкладку Network
3. Поставьте фильтр запросов Wasm справа сверху
4. В списке запросов найдите тот, в названии которого есть слово "target"
5. Нажмите на него и скопируйте Request URL

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FGg1ri0gEee3jVJFM2Ctn%2Fimage.png?alt=media&#x26;token=284bba61-bc78-4bdf-aeee-b08d444dadeb" alt=""><figcaption></figcaption></figure>

#### ‼️Возможные ошибки

1. Invalid signature\
   Lighter сменил `seed` для аккаунта, нужно скопировать новые данные `seed` и `index` из браузера и вставить в бота. \
   Это случается если вы авторизовались в аккаунт Lighter с новой подписью после очистки кэша в браузере или с нового антидетект профиля. &#x20;

***

### Настройки Paradex

#### :file\_folder: config/paradex/accounts.txt

Формат - `label,ethereumPrivateKey,paradexAddress,paradexPrivateKey,proxy`

`label` - обязательная метка для обозначения аккаунта\
`ethereumPrivateKey` - приватный ключ кошелька связанного с Paradex аккаунтом\
`paradexAddress` - адрес аккаунта Paradex\
`paradexPrivateKey` - приватный ключ аккаунта Paradex\
`proxy` - прокси аккаунта

Как получить `paradexAddress` и `paradexPrivateKey`:

1. Зайдите в свой аккаунт Paradex
2. Нажмите на адрес кошелька справа сверху
3. Скопируйте Paradex Address и Paradex Private Key

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FZNy6xaXJbRrCrQtaeSgb%2Fimage.png?alt=media&#x26;token=bcc03097-1238-4ce3-9d8d-271ff26fb3e5" alt=""><figcaption><p>Экспорт paradexAddress + paradexPrivateKey (Адрес -> Wallet) </p></figcaption></figure>

***

### Настройки Hyperliquid

#### :file\_folder: config/hyperliquid/accounts.txt

Формат - `label,ethereumPrivateKey,proxy`

`label` - обязательная метка для обозначения аккаунта\
`ethereumPrivateKey` - приватный ключ кошелька связанного с Hyperliquid аккаунтом\
`proxy` - прокси аккаунта

***

### Настройки Aster

#### :file\_folder: config/aster/accounts.txt

Формат - `label,apiKey,apiSecret,proxy`

`label` - обязательная метка для обозначения аккаунта\
`apiKey`- api ключ аккаунта Aster\
`apiSecret` - секрет от api аккаунта Aster\
`proxy` - прокси аккаунта

Как получить `apiKey` и `apiSecret`:

1. Зайдите в свой аккаунт Aster
2. Нажмите на адрес кошелька справа сверху
3. Скопируйте API key и API secret key

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2Fk2MnjQJqcPR8CmKciPlZ%2Fimage.png?alt=media&#x26;token=58e1346a-e604-4332-8bce-35644c0fd5eb" alt=""><figcaption></figcaption></figure>

***

### Настройки Pacifica

#### :file\_folder: config/pacifica/pacifica.txt

Формат - `label,privateKey,solanaAddress,proxy`

`label` - обязательная метка для обозначения аккаунта\
`privateKey`- приватный ключ от API вашего аккаунта Pacifica\
`solanaAddress` - адрес SOL кошелька, который привязан к аккаунту Pacifica\
`proxy` - прокси аккаунта

Как получить `privateKey`:

1. Зайдите в свой аккаунт Pacifica
2. Перейдите во вкладку API Keys
3. Скопируйте ключ белого цвета

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FF4Bks57x3emkac2CVmAI%2Fimage.png?alt=media&#x26;token=528730b1-4ae2-4d1a-8ca6-a9f0c52b531b" alt=""><figcaption></figcaption></figure>

***

### Настройки EdgeX

#### :file\_folder: config/edgex/accounts.txt

Формат - `label,console_key,proxy`

`label` - обязательная метка для обозначения аккаунта\
`console_key` - данные аккаунта полученные из консоли браузера\
`proxy` - прокси аккаунта

Как получить `console_key`:

1. Зайдите в свой аккаунт EdgeX через браузер
2. Откройте консоль разработчика (нажмите F12)
3. Вставьте команду ниже и нажмите Enter
4. `console_key` появятся в логах, его можно скопировать

```javascript
const user = JSON.parse(localStorage.getItem('user'))
const currentAccount = user.state.currentActiveAccount
const keys = currentAccount.keys
console.log(`${currentAccount.id},${Object.values(keys.apiKey).join(',')},${keys.l2Key.privateKey}`)
```

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FmeFQm4m1FrdB6JcKZGe3%2Fimage.png?alt=media&#x26;token=2269f66d-929a-41db-b616-25a3c309b743" alt=""><figcaption></figcaption></figure>

***

### Настройки Extended

#### :file\_folder: config/extended/accounts.txt

Формат - `label`,`apiKey`, `starkPublicKey`, `starkPrivateKey`, `vaultNumber`, `clientId`,`proxy`

`label` - обязательная метка для обозначения аккаунта\
`apiKey`, `starkPublicKey`, `starkPrivateKey`, `vaultNumber`, `clientId` - данные API созданного на аккаунте Extended\
`proxy` - прокси аккаунта

Как получить `apiKey`, `starkPublicKey`, `starkPrivateKey`, `vaultNumber`, `clientId`:

1. Зайдите в свой аккаунт Extended через браузер
2. Перейдите в More -> API
3. Нажмите Generate API Key -> Show API Details
4. Скопируйте все нужные данные

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FVlAsSIp1lbMpTOna5B05%2FFrame%201376.png?alt=media&#x26;token=dcfbb420-5341-4e9a-bd55-a605dc6385ac" alt=""><figcaption></figcaption></figure>

***

### Настройки Ethereal

#### :file\_folder: config/ethereal/accounts.txt

Формат - `label`,`privateKey`, `proxy`

`label` - обязательная метка для обозначения аккаунта\
`privateKey` - приватный ключ от вашего кошелька связанного с аккаунтом Ethereal\
`proxy` - прокси аккаунта

***

### Настройки TradeXYZ

#### :file\_folder: config/tradexyz/accounts.txt

Формат - `label,ethereumPrivateKey,proxy`

`label` - обязательная метка для обозначения аккаунта\
`ethereumPrivateKey` - приватный ключ кошелька связанного с TradeXYZ аккаунтом\
`proxy` - прокси аккаунта

Чтобы запустить XYZ маркеты (NVDA и др.) надо в поле markets в config.json указать пару в формате `xyz`:`market`. Например xyz:NVDA.

***

### Настройки Nado

#### :file\_folder: config/nado/nado.txt

Формат - `label`,`privateKey`, `proxy`

`label` - обязательная метка для обозначения аккаунта\
`privateKey` - приватный ключ от вашего кошелька связанного с аккаунтом Nado\
`proxy` - прокси аккаунта

***

### Настройки Variational

#### :file\_folder: config/variational/variational.txt

Формат - `label`,`privateKey`, `proxy`

`label` - обязательная метка для обозначения аккаунта\
`privateKey` - приватный ключ от вашего кошелька связанного с аккаунтом Variational\
`proxy` - прокси аккаунта

***

### Настройки 01 Exchange

#### :file\_folder: config/01/01.txt

Формат - `label`,`privateSolanaKey`, `proxy`

`label` - обязательная метка для обозначения аккаунта\
`privateSolanaKey` - приватный ключ от вашего кошелька связанного с аккаунтом 01 Exchange\
`proxy` - прокси аккаунта

***

### config.json

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

> Все timeout в файле указываются в **миллисекундах**

`random_pairs` - будет ли бот случайным образом подбирать аккаунты 1 к 1, или вы хотите указать самостоятельно пары. Если *false*, то: `pairs.txt` -> и с новой строки указываете какие *label* с каким будут в паре, пример:\
\
\&#xNAN;*Osnova1,Osnova6* \
*Osnova3,Osnova5* \
и тд

`max_leverage` - какое максимальное кредитное плече использовать\
`min_balance` - какой минимальный баланс должен быть на одной из бирж для старта торгов\
`balance_percentage_range` - какой баланс использовать для прокрута\
`markets` - список торговых пар для отработки\
`cycles` - кол-во кругов что сделает бот перед остановкой\
`sleep_between_hedge` - задержка между кругами (циклами)\
`retries` - если бот за N попыток не смог открыть хедж, то все запланированные хеджи для этих аккаунтов отменяются, а также бот будет 5 раз проверять нет ли открытых позиций и закрывать если есть

`use_funding` - если `true` бот будет учитывать фандинг при расчёте спреда (работает только при двух аккаунтах в группе). Это позволяет правильно открывать позиции при противоположных ставках фандинга на двух DEX.

`balance_percentage_range` - какой баланс использовать для прокрута

`min_live_time` - сколько по времени держать позицию открытой\\

\
`wait_spread_timeout` - при выборе пары, сколько ждать подходящий спред. если за указанное время не будет подходящих цен для открытия ордера, то бот выберет новую пару\\

\
`wait_order_fill_timeout` - сколько ожидать заполнение ордеров. бот открывает ордера лимитками, и если на 1 бирже она заполнилась за отведенное время, а на другой нет, то бот закроет по маркету первую позицию и начнет искать новую пару\\

\
`wait_close_spread_timeout` - закрывать ли позицию после `min_live_time` если неподходящий спред. Если *false*, то бот будет бесконечно ждать пока не появится возможность закрыть позицию в 0, или в указанные вами спреды . Если *true*, то бот будет ждать `wait_spread_timeout`, и если не смог дождаться нужной разницы, то просто закроет 2 позы с текущих значений

`OXYGEN_API_KEY` - API Ключ вашего Oxygen.Tools аккаунта для доступа к софтам

{% hint style="info" %}
`Логин, Пароль, API Ключ` — находятся в личном кабинете телеграм бота\
<https://t.me/OduLandBot?start=r_oxygen_x>\
\
Личный кабинет -> Доступ к софтам -> API Ключ
{% endhint %}

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FYFuRxKQgROwHn33boVHg%2FFind%20Login%20and%20API%20key.gif?alt=media&#x26;token=55a6e71c-f4b6-44a2-b667-3752f29ada05" alt=""><figcaption><p>Авторизация</p></figcaption></figure>

### groups.txt

В этом файле вы можете настроить какие аккаунты будут хеджироваться друг с другом.&#x20;

**Доступные стратегии:**

* 2 аккаунта (например: backpack + paradex)
* 3 аккаунта (например: lighter1 + lighter2 + lighter3)\
  \*работает только для связки аккаунтов одной биржи

**Форматы данных:**

* 2 аккаунта — `backpack1,lighter1`&#x20;
* 3 аккаунта — `lighter1,lighter2,lighter3;50,20-25,20-30`&#x20;

Бот автоматически распознает связки аккаунтов указанные в файле, меняет стратегию если 2 биржи или 3 биржи.

**Что значит количество аккаунтов, и для чего это нужно?:**

**2 аккаунта**\
Бот открывает на одной бирже лонг на 50% суммы, а на другой шорт так же на 50%. Привычный способ отработки перпов.

**3 аккаунта**\
Бот открывает на одном аккаунте биржи лонг/шорт на 50% суммы, а на двух остальных зеркальную сделку на те же 50% суммы, но которая разделится на два аккаунта.&#x20;

Формат - `lighter1,lighter2,lighter3;50,20-25,20-30`&#x20;

`50,20-25,20-30` - это распределение ликвидности между аккаунтами.\
Можно указывать как точные значения - `50,27,23` , так и плавающие - `50,20-25,20-30` (бот будет рандомить)

Например: вы указали такие значения - `50,20-25,20-30` \
Распределение для группы аккаунтов по итогу может быть следующим: \
Аккаунт 1 - 50% от суммы\
Аккаунт 2 - 22% от суммы\
Аккаунт 3 - 28% от суммы

Стратегия на 3 аккаунта сделана для точечной отработки одной биржи. Например если вы хотите крутить только Lighter.

При отработке одной биржи на 2 аккаунтах — на одном лонг, а на другом шорт, вы получите блокировку с шансом 98%.\
Но если вы используете 3 аккаунта, то шанс поймать блокировку стремится к 0%. Бот будет брать 1 аккаунт за главного, при чем каждый раз разного, и открывать полную позицию, а противоположную сделку разделит на другие аккаунты поровну.

Так если `lighter1` откроет лонг на 500$, то `lighter2` и `lighter3` откроют шорты на 500$ общей суммы но с распределением, которое вы указали в формате (например 220$ и 280$).

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FG43w9Eb7YinnxJdLEs1S%2Fimage.png?alt=media&#x26;token=83970821-bbe0-4ae9-81ad-1c84a369359c" alt=""><figcaption><p>Пример стратегии на 3 аккаунта</p></figcaption></figure>

***

## 🧠 Логика софта

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

### Поиск монеты

1. Выбирает случайную монет из списка `markets`&#x20;
2. Ждёт на ней подходящий `min_spread` по таймеру из `open_spread_timeout`
3. Если за `open_spread_timeout` не удалось дождаться нужного `min_spread`, то выбирает другую случайную монету из markets

### Открытие сделки

Сделки открываются на % от баланса, который указан в `balance_percentage_range`

1. Как только бот находит нужный `min_spread` на выбранной монете, он анализирует стакан под ваш объём предполагаемого ордера, и если всё хорошо, то он выставляет лимитный ордер на двух биржах
2. Ожидание заполнения выставленных ордеров длиться `wait_order_fill_timeout`   \
   \
   2.1 Если по какой-то причине на одной из бирж за время `wait_order_fill_timeout` не заполнился полностью ордер, то бот продаёт позиции на двух биржах по маркету (запоминает объём и записывает комиссии, но отобразит это только в таблице с подсчетом успешного круга открытия и закрытия)

### Жизнь ордера

Бот будет держать открытыми заполненные позиции на биржах ориентируясь на `min_live_time`, после его окончания перейдет к закрытию сделки.&#x20;

#### Отслеживание ликвидаций

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

### Закрытие сделки

1. Бот начинает ожидание спреда от "0 до `min_spread`" на монете. Если в настройке `use_close_spread_timeout` стоит `true`, то ориентируется на время из `wait_close_spread_timeout`. Если false, то ждёт бесконечно
2. Как только бот видит подходящий `min_spread` в стакане, он выставляет ордера на продажу и ждёт `wait_order_fill_timeout`. Если за время `wait_order_fill_timeout` на какой-то из бирж бот не дождался полного заполнения ордера, то он обе биржи закрывает по маркету
3. Если `use_close_spread_timeout` установлен на `true`, то он начинает искать возможность закрытия в диапазоне между "0 и `min_spread`". Это ожидание длиться столько же, сколько и время `wait_close_spread_timeout`.
4. Если бот не смог дождаться спреда даже в 0, то начинает искать в диапазоне от "минус `min_spread` до плюс `min_spread`", например: от -0.04% до 0.04%. Проверка такого диапазона будет длиться `wait_close_spread_timeout`.
5. Если даже так дождаться не удалось, то закрывает ордера по маркету

***

{% hint style="info" %}
Все дальнейшие обновления будут публиковаться в нашем паблике: <https://t.me/oxygen_tools>

Ветка в закрытом комьюнити для обсуждения: <https://t.me/c/1908008923/61461/64129>
{% endhint %}

<figure><img src="https://4043961612-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9XoggI4ezKP2sOs4B2tY%2Fuploads%2FnrX6MAHDDes7CX3O5VmV%2Fperpl.gif?alt=media&#x26;token=52bf6bca-843b-41ac-95de-6c26c02061ad" alt=""><figcaption><p>Интерфейс софта</p></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tools.oxygen.wiki/docs/soft/perpland.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
