у меня есть расширение для google на JS manifest { "manifest_version": 3, "name": "Info Extractor", "version": "1.0", "action": { "default_popup": "popup.html", "default_icon": "icons/icon128.png" }, "permissions": ["activeTab", "scripting"], "background": { "service_worker": "background.js" } } background function updateData() { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { if (tabs.length === 0) return; // Нет активной вкладки chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, func: () => { document.querySelectorAll('.by-table-row').forEach((row) => { const cells = row.querySelectorAll('.by-table-cell'); const orderPriceCell = cells[8]; if (cells[5].innerText === 'Купить' && cells[11]) { orderPriceCell.innerText = cells[11].innerText; // Ставим "Цену предложения" } else if (cells[5].innerText === 'Продать' && cells[7]) { orderPriceCell.innerText = cells[7].innerText; // Ставим "Цену спроса" } }); }, }); }); } // Запускаем обновление данных каждую секунду setInterval(updateData, 500); popup Отправить в книгу ордеров. Click Original Button Введите новое значение Обновить значение popup document.getElementById('fetchButton').addEventListener('click', () => { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, func: () => { console.log('Скрипт начал выполняться'); // Получаем все строки таблицы const rows = Array.from(document.querySelectorAll('.by-table-row')); let positions = []; // Пропускаем первые две строки rows.forEach((row, index) => { if (index < 2) return; const cells = row.querySelectorAll('.by-table-cell'); const orderPriceIV = cells[8]?.innerText.trim(); const direction = cells[5]?.innerText.trim(); const quantityCell = cells[9]; // Ссылка на DOM элемент для quantity const quantity = parseFloat(quantityCell.innerText.trim()) || 0; const askSize = parseFloat(cells[10]?.innerText.trim(), 10) || 0; const bidSize = parseFloat(cells[6]?.innerText.trim(), 10) || 0; if (orderPriceIV && direction) { let position = { orderPriceIV, direction, quantity, quantityCell, // Сохраняем ссылку на DOM элемент askSize, bidSize, }; positions.push(position); } }); console.log('Собранные позиции:', positions); // Функция для изменения количества по минимальному коэффициенту const scaleAllQuantities = (positions) => { let scaleFactors = []; // Группируем позиции по цене ордера const groupedByOrderPrice = positions.reduce((acc, position) => { if (!acc[position.orderPriceIV]) { acc[position.orderPriceIV] = []; } acc[position.orderPriceIV].push(position); return acc; }, {}); Object.keys(groupedByOrderPrice).forEach((orderPrice) => { const group = groupedByOrderPrice[orderPrice]; console.log(`Группа для цены ${orderPrice}:`, group); const buyGroup = group.filter(pos => pos.direction === 'Купить'); const sellGroup = group.filter(pos => pos.direction === 'Продать'); // Вычисляем коэффициенты масштабирования для каждой группы if (buyGroup.length > 0) { const totalAskSize = buyGroup[0].askSize; // Предполагаем одинаковый размер аска для всех в группе const totalQuantity = buyGroup.reduce((sum, pos) => sum + pos.quantity, 0); if (totalQuantity > totalAskSize) { scaleFactors.push(totalAskSize / totalQuantity); } } if (sellGroup.length > 0) { const totalBidSize = sellGroup[0].bidSize; // Предполагаем одинаковый размер бида для всех в группе const totalQuantity = sellGroup.reduce((sum, pos) => sum + pos.quantity, 0); if (totalQuantity > totalBidSize) { scaleFactors.push(totalBidSize / totalQuantity); } } }); // Находим минимальный коэффициент масштабирования const minScaleFactor = Math.min(...scaleFactors, 1); console.log(`Минимальный коэффициент масштабирования: ${minScaleFactor * 100}%`); // Применяем минимальный коэффициент масштабирования ко всем позициям positions.forEach(pos => { const newQuantity = pos.quantity * minScaleFactor; pos.quantity = newQuantity; pos.quantityCell.innerText = newQuantity.toFixed(2); // Обновляем текст элемента на странице }); return minScaleFactor < 1; }; // Вызов функции scaleAllQuantities и контроль выполнения let requiredScaling = scaleAllQuantities(positions); if (!requiredScaling) { console.log('Все условия выполнены, продолжаем выполнение скрипта.'); const firstButton = document.querySelector('.by-button.by-builder-opr-btn.by-button--contained.by-button--xx-large.by-button--brand'); if (firstButton) { firstButton.click(); setTimeout(() => { const secondButton = document.querySelector('.by-button.by-dialog__btn.by-button--contained.by-button--xx-large.by-button--brand'); if (secondButton) { secondButton.click(); } else { console.log('Вторая кнопка не найдена'); } }, 1000); } else { console.log('Первая кнопка не найдена'); } } else { console.log('Количество в позициях было изменено для соответствия доступным размерам.'); // Выполнить программу, нажатие кнопок const firstButton = document.querySelector('.by-button.by-builder-opr-btn.by-button--contained.by-button--xx-large.by-button--brand'); if (firstButton) { firstButton.click(); setTimeout(() => { const secondButton = document.querySelector('.by-button.by-dialog__btn.by-button--contained.by-button--xx-large.by-button--brand'); if (secondButton) { secondButton.click(); } else { console.log('Вторая кнопка не найдена'); } }, 1000); } else { console.log('Первая кнопка не найдена'); } } } }); }); }); document.getElementById('simulateButton').addEventListener('click', () => { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, func: () => { const button = document.querySelector('.by-button.by-builder-opr-btn.by-button--contained.by-button--xx-large.by-button--primary'); if (button) { button.click(); // Симулируем нажатие на кнопку } } }); }); }); document.getElementById('updateValueButton').addEventListener('click', () => { const newValue = document.getElementById('newValue').value; chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, func: (value) => { const element = document.querySelector('.pb-position-editor.pb-position-editor-qty-containner'); if (element) { element.innerText = value; // Обновляем текст элемента } }, args: [newValue] // Передаем новое значение }); }); }); function updateData() { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, func: () => { let data = []; document.querySelectorAll('.by-table-row').forEach((row) => { const cells = row.querySelectorAll('.by-table-cell'); let rowData = { modeledPositions: cells[0] ? cells[0].innerText : '--', leverage: cells[1] ? cells[1].innerText : '--', expiration: cells[2] ? cells[2].innerText : '--', strikePrice: cells[3] ? cells[3].innerText : '--', type: cells[4] ? cells[4].innerText : '--', direction: cells[5] ? cells[5].innerText : '--', bidSize: cells[6] ? cells[6].innerText : '--', bidPriceIV: cells[7] ? cells[7].innerText : '--', orderPriceIV: cells[8] ? cells[8].innerText : '--', quantity: cells[9] ? cells[9].innerText : '--', askSize: cells[10] ? cells[10].innerText : '--', askPriceIV: cells[11] ? cells[11].innerText : '--', pnl: cells[12] ? cells[12].innerText : '--', delta: cells[13] ? cells[13].innerText : '--', gamma: cells[14] ? cells[14].innerText : '--', vega: cells[15] ? cells[15].innerText : '--', theta: cells[16] ? cells[16].innerText : '--', action: cells[17] ? cells[17].innerText : '--' }; // Логика для обновления "Цены ордера" в зависимости от "Направления" const orderPriceCell = cells[8]; if (rowData.direction === 'Купить' && cells[11]) { orderPriceCell.innerText = cells[11].innerText; // Ставим "Цену предложения" } else if (rowData.direction === 'Продать' && cells[7]) { orderPriceCell.innerText = cells[7].innerText; // Ставим "Цену спроса" } data.push(rowData); }); return data; }, }, (results) => { if (results && results[0]) { let data = results[0].result; let dataDiv = document.getElementById('data'); // Очистить предыдущие данные dataDiv.innerHTML = ''; // Создаем таблицу let table = document.createElement('table'); data.forEach(rowData => { let row = document.createElement('tr'); let columns = [ 'modeledPositions', 'leverage', 'expiration', 'strikePrice', 'type', 'direction', 'bidSize', 'bidPriceIV', 'orderPriceIV', 'quantity', 'askSize', 'askPriceIV', 'pnl', 'delta', 'gamma', 'vega', 'theta', 'action' ]; columns.forEach(key => { let cell = document.createElement('td'); cell.innerText = rowData[key]; row.appendChild(cell); }); table.appendChild(row); }); dataDiv.appendChild(table); } }); }); } setInterval(updateData, 500); мне нужно что бы если после нажатия кнопки Отправить в книгу ордеров было изменено количество quantity после должна произойти докупка до того момента пока количество quantity не дойдет до того что было указано мной в начале