May 24

Скрипт для автоматического набива объёма на Binance Alpha

Написано админом канала capONE

Как запустить?

1) Перейдите на страницу Binance Alpha и выберите монету на которой будете делать объём

2) Нажмите на (cmd + option + i) или f12 если используете виндовс. У вас должна открыться консоль.

3) Вставьте код и измените такие настройки:
• const purchaseAmount = "2080" - сума которая будет использоваться для покупки

• const iterations = 5 - количество итерация (сколько раз будет выполняться покупка и продажа)

Как включить подсчёт затрат:

Настраиваем панель ордеров так же как и у меня на скриншоте, после окончания работы скрипта, он выдаст вам стату:
• объём покупок
• объём продаж
• затраты на прокрученный объём

Сам скрипт:

(async function () {
const delay = ms => new Promise(res => setTimeout(res, ms));

let totalSpentUSDT = 0;
let totalReceivedUSDT = 0;
const purchaseAmount = 2080;

async function waitForSelector(selector, timeout = 10000) {
return new Promise((resolve, reject) => {
const interval = 100;
let elapsed = 0;
const check = () => {
const el = document.querySelector(selector);
if (el) return resolve(el);
elapsed += interval;
if (elapsed >= timeout) return reject(`Timeout: ${selector} not found`);
setTimeout(check, interval);
};
check();
});
}

async function waitForXPath(xpath, timeout = 10000) {
return new Promise((resolve, reject) => {
const interval = 100;
let elapsed = 0;
const check = () => {
const result = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
if (result) return resolve(result);
elapsed += interval;
if (elapsed >= timeout) return reject(`Timeout: XPath ${xpath} not found`);
setTimeout(check, interval);
};
check();
});
}

async function waitForActiveButton(label, timeout = 15000) {
const interval = 300;
let waited = 0;

while (waited < timeout) {
const btn = [...document.querySelectorAll('button')].find(b =>
b.textContent.includes(label) &&
!b.disabled &&
b.getAttribute('aria-disabled') !== 'true'
);

if (btn) return btn;

await delay(interval);
waited += interval;
}

throw new Error(`❌ Кнопка '${label}' не стала активной за ${timeout / 1000} секунд`);
}

function setNativeValue(element, value) {
const prototype = Object.getPrototypeOf(element);
const valueSetter = Object.getOwnPropertyDescriptor(prototype, 'value')?.set;
if (valueSetter) {
valueSetter.call(element, value);
element.dispatchEvent(new Event('input', { bubbles: true }));
element.dispatchEvent(new Event('change', { bubbles: true }));
} else {
console.warn("Не удалось найти сеттер для input.value");
}
}

async function waitForAvailableBalance(minValue = 0.000001, timeout = 30000) {
const interval = 500;
let waited = 0;

while (waited < timeout) {
const availableEl = document.querySelector('.text-PrimaryText.t-caption1');
const availableText = availableEl?.textContent?.trim() || '0';
const availableAmount = parseFloat(availableText);

if (!isNaN(availableAmount) && availableAmount > minValue) {
console.log(`✅ Обнаружен баланс: ${availableAmount}`);
return availableAmount;
}

await delay(interval);
waited += interval;
}

throw new Error(`⏳ Баланс не стал больше ${minValue} за ${timeout / 1000} секунд`);
}

async function automateTradeFlow() {
try {
const priorityBlock = await waitForXPath("//div[contains(@class, 'space-x-[6px]') and .//span[text()='Приоритет по цене']]");
priorityBlock.click();
console.log("🔧 Клик: Приоритет по цене");

const configureBtn = await waitForXPath("//div[contains(@class, 'rounded-[12px]') and .//div[text()='Настроить']]");
configureBtn.click();
console.log("🔧 Клик: Настроить");

await delay(1000);

const slippageInput = await waitForSelector("input#customize-slippage");
setNativeValue(slippageInput, '0.1');
console.log("🔧 Установлено проскальзывание: 0.1");

const standardOption = await waitForXPath("//div[contains(@class, 'rounded-[8px]') and .//span[contains(text(),'Стандартный')]]");
standardOption.click();
console.log("🔧 Клик: Стандартный");

const confirmBtn = await waitForXPath("//button[contains(@class, 'bn-button__primary') and contains(text(), 'Подтвердить')]");
confirmBtn.click();
console.log("🔧 Клик: Подтвердить");

} catch (error) {
console.error("❌ Ошибка при настройке проскальзывания:", error);
}
}

function collectTradeValues() {
const allDivs = [...document.querySelectorAll('div')];

const spentDiv = allDivs.find(el =>
el.textContent.includes('USDT') &&
el.textContent.trim().startsWith('-') &&
!el.classList.length
);

const receivedDiv = allDivs.find(el =>
el.textContent.includes('USDT') &&
el.textContent.trim().startsWith('+') &&
el.classList.contains('text-Buy')
);

const spent = spentDiv ? parseFloat(spentDiv.textContent.replace(/[^0-9.]/g, '')) : 0;
const received = receivedDiv ? parseFloat(receivedDiv.textContent.replace(/[^0-9.]/g, '')) : 0;

totalSpentUSDT += spent;
totalReceivedUSDT += received;

console.log(`🐝 Потрачено: ${spent}, Получено: ${received}`);
}

async function switchToTab(name) {
const tab = [...document.querySelectorAll('[role="tab"], .bn-tab')].find(el =>
el.textContent.trim().includes(name)
);
if (tab) {
tab.click();
await delay(1000);
}
}

async function completePurchase() {
console.log("🔄 Начинаем процесс покупки...");
await switchToTab("Покупка");

const input = document.querySelector('#fromCoinAmount');
if (!input) {
console.error("❌ Поле ввода суммы не найдено");
return false;
}

input.focus();
setNativeValue(input, purchaseAmount);
input.dispatchEvent(new Event('change', { bubbles: true }));
await delay(2000);

await automateTradeFlow();

let buyBtn;
try {
buyBtn = await waitForActiveButton("Покупка");
} catch (err) {
console.error(err.message);
return false;
}

buyBtn.click();
await delay(3000);

let confirmBtn;
try {
confirmBtn = await waitForActiveButton("Подтвердить");
} catch (err) {
console.warn(err.message);
return false;
}

confirmBtn.click();
await delay(5000);

await switchToTab("Продажа");

return true;
}

async function setupSell() {
let shouldContinueWithSell = true;

try {
await waitForAvailableBalance(0.000001, 30000);
} catch {
console.warn("⚠️ Баланс не появился за 30 секунд. Переход к 'Покупке' для проверки.");
await switchToTab("Покупка");

const usdtEl = [...document.querySelectorAll('.text-PrimaryText.t-caption1')]
.find(el => el?.textContent?.includes("USDT"));
const usdtText = usdtEl?.textContent?.replace(/[^\d.]/g, '') || '0';
const usdtAmount = parseFloat(usdtText);

if (!isNaN(usdtAmount) && usdtAmount >= purchaseAmount) {
console.log(`✅ Доступно USDT: ${usdtAmount}, пробуем купить ещё раз`);
const repurchased = await completePurchase();
if (!repurchased) {
console.warn("⚠️ Повторная покупка не удалась");
}
} else {
console.warn(`⚠️ Недостаточно USDT для повторной покупки (${usdtAmount} < ${purchaseAmount})`);
await switchToTab("Продажа");
}
}

// Даже если не было баланса — продолжаем попытку продать
await switchToTab("Продажа");

const slider = document.querySelector('.bn-slider');
if (!slider) {
console.warn("❌ Ползунок не найден");
return false;
}

setNativeValue(slider, 100);
slider.dispatchEvent(new Event('input', { bubbles: true }));
slider.setAttribute('aria-valuenow', '100');
slider.setAttribute('aria-valuetext', '100 units');

const thumb = document.querySelector('.bn-slider-track-thumb');
if (thumb) thumb.style.width = '100%';

const steps = document.querySelectorAll('.bn-slider-track-step');
steps.forEach(step => step.classList.remove('active'));
if (steps.length > 0) steps[steps.length - 1].classList.add('active');

await delay(1000);
await automateTradeFlow();

return true;
}

async function waitAndClickSellButton() {
let sellBtn;
try {
sellBtn = await waitForActiveButton("Продажа");
} catch (err) {
console.warn(err.message);
return;
}

sellBtn.click();
await delay(3000);

let confirmBtn;
try {
confirmBtn = await waitForActiveButton("Подтвердить");
} catch (err) {
console.warn("⚠️ Кнопка подтверждения продажи не найдена");
return;
}

confirmBtn.click();
await delay(5000);
}

const iterations = 8;
for (let i = 1; i <= iterations; i++) {
console.log(`\n🌀 === Цикл ${i} из ${iterations} ===`);
const purchased = await completePurchase();
if (!purchased) break;

const sellReady = await setupSell();
if (!sellReady) break;

await waitAndClickSellButton();
await delay(5000);
collectTradeValues();
}

const totalFee = totalSpentUSDT - totalReceivedUSDT;

console.log("==============================");
console.log(`💵 Total spent: ${totalSpentUSDT.toFixed(6)} USDT`);
console.log(`💰 Total received: ${totalReceivedUSDT.toFixed(6)} USDT`);
console.log(`🧾 Total loss/fee: ${totalFee.toFixed(6)} USDT`);
console.log("==============================");
})();