您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
将平均值添加到52周范围的显示区块中
// ==UserScript== // @name 标普ETF定投策略 // @namespace http://tampermonkey.net/ // @version 1.2 // @description 将平均值添加到52周范围的显示区块中 // @match https://cn.investing.com/etfs/* // @grant none // ==/UserScript== (function() { 'use strict'; function insertAverage() { // 定位包含平均值的父div const parentDiv = document.querySelector('div.flex.basis-1\\/2.flex-col.items-start.gap-1\\.5.sm\\:basis-\\[33\\.333\\%\\].md\\:basis-auto.md\\:flex-row.md\\:gap-2.md\\:order-4'); // 定位目标div(52周范围) const targetDiv = document.querySelector('div.text-xs\\/4.flex-1'); // 定位当前价格div const priceDiv = document.querySelector('div[data-test="instrument-price-last"]'); // 定位所有匹配的div(text-xs/4 flex-1) const targetDivs = document.querySelectorAll('div.text-xs\\/4.flex-1'); // 检查是否存在至少两个匹配的div if (targetDivs.length >= 2) { const secondTargetDiv = targetDivs[1]; // 获取第二个div console.log('第二个目标div:', secondTargetDiv); // 在这里对 secondTargetDiv 进行操作 } else { console.error('未找到第二个目标div,匹配数量:', targetDivs.length); } if (priceDiv) { // 获取文本内容并转换为保留三位小数的数字 const priceText = priceDiv.textContent.trim(); const price = parseFloat(priceText); if (!isNaN(price)) { const priceFormatted = price.toFixed(3); // 保留三位小数 console.log('价格(保留三位小数):', priceFormatted); // 输出例如:2.156 } else { console.error('无法解析价格:', priceText); } } else { console.error('未找到价格div'); } if (parentDiv && targetDiv) { // 从父div中提取平均值 const averageDiv = parentDiv.querySelector('div.self-stretch.text-xs.font-semibold.leading-4.text-black.rtl\\:text-right'); if (averageDiv) { const averageValue = parseFloat(averageDiv.innerText); const priceText = priceDiv.textContent.trim(); const price = parseFloat(priceText); const secondTargetDiv = targetDivs[1]; // 获取第二个div if (!isNaN(averageValue) && !document.querySelector('#inserted-average')) { // 创建新div const newDiv = document.createElement('div'); newDiv.id = 'inserted-average'; newDiv.className = 'text-xs/4 flex-1'; // 保留原布局类 if(averageValue>price){ newDiv.innerHTML = ` <div class="text-secondary mb-0.5" style="color: red; font-size: 14px;">30天均值</div> <div class="font-bold tracking-[0.2px]" style="color: red; font-size: 22px;">${averageValue.toFixed(3)} > ${price} 增加+</div> <a href="https://intumu.com/" class="navbar-brand" style="margin-top: 20px; margin-bottom: 20px;">更多策略:<b>IN</b>tumu.com</a> `; // 插入到目标div后面 secondTargetDiv.insertAdjacentElement('afterend', newDiv); } else { newDiv.innerHTML = ` <div class="text-secondary mb-0.5" style="color: blue; font-size: 14px;">30天均值</div> <div class="font-bold tracking-[0.2px]" style="color: blue; font-size: 22px;">${averageValue.toFixed(3)} < ${price} 减少-</div> <a href="https://intumu.com/" class="navbar-brand" style="margin-top: 20px; margin-bottom: 20px;">更多策略:<b>IN</b>tumu.com</a> `; // 插入到目标div后面 secondTargetDiv.insertAdjacentElement('afterend', newDiv); } console.log('已插入平均值:', averageValue); return true; } else { console.error('无法解析平均数值或已插入:', averageDiv ? averageDiv.innerText : '未找到平均值div'); } } else { console.error('未找到平均值子div'); } } else { console.error('未找到目标元素:', { parentDiv: !!parentDiv, targetDiv: !!targetDiv }); } return false; } // 初始尝试插入 if (insertAverage()) return; // 观察DOM变化(动态加载支持) const observer = new MutationObserver(() => { if (insertAverage()) { observer.disconnect(); // 插入成功后停止观察 } }); observer.observe(document.body, { childList: true, subtree: true }); })();