您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
用以快捷显示累计净值,任期回报,平均回报,一年前累计净值,月高点,月低点
当前为
// ==UserScript== // @name 天天基金数据抽取 // @namespace http://tampermonkey.net/ // @version 1.5.0 // @description 用以快捷显示累计净值,任期回报,平均回报,一年前累计净值,月高点,月低点 // @author aotmd // @match http://fund.eastmoney.com/* // @match http://*.eastmoney.com/* // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @noframes // @license MIT // ==/UserScript== const setting = { 是否查看近一年净值: true,//批量查看时防止卡顿,建议关闭 自动关闭不满5年基金: false,//自动关闭基金经理任期低于5年的基金,选指数基金时关闭 自动关闭平均回报过低基金: false,//自动关闭业绩不好的基金 指数基金年化代替为成立以来年化: false,//用来选指数基金 指数用成立时间不满5年则关闭:false,//用来选指数基金 满五年日期常量:"2016-12-31", 回报率常量:19, }; (function() { addLoadEvent(() => { var url = window.location.href; //主页面 var str = /fund\.eastmoney\.com\/.+/i; //净值页面 var str2 = /.+eastmoney\.com.+/i; if (str.test(url)) { window.setTimeout(() => { //做好显示面板 let divElement1 = document.createElement('div'); divElement1.className = "gs1"; document.body.appendChild(divElement1); divElement1.style = "top: calc( 15% - 42px );;font-size: 16px;"; let divElement2 = document.createElement('div'); divElement2.className = "gs1"; document.body.appendChild(divElement2); let divElement3 = document.createElement('div'); divElement3.className = "gs1"; document.body.appendChild(divElement3); divElement3.style = "top: calc( 15% + 190px );"; //显示基金名称 var 基金名称 = document.querySelector("#body > div:nth-child(8) > div > div > a:nth-child(7)").innerText; divElement1.innerHTML = 基金名称; var 任期回报 = (document.querySelector("tr.noBorder > td.td04.bold").innerText.replace("%", "") / 100).toFixed(4); var 任职时间 = document.querySelector("tr.noBorder > td.td01").innerText.replace("~至今", ""); var 累计净值 = document.querySelector("dl.dataItem03 > dd.dataNums > span").innerText; var 净值时间 = document.querySelector("dl.dataItem02 > dt > p").innerText.split('(')[1].replace(')', ''); //取得指定股票代码 var 股票代码 = window.location.pathname.replace("/", "").replace(".html", ""); var 净值网址 = document.querySelector("#Div2 > div.item_title.hd > div.item_more > a").href; var 平均回报率 = ((Math.pow(Number(任期回报) + 1, 1 / (GetNumberOfDays(new Date(), 任职时间) / 365)) - 1) * 100).toFixed(2); var 成立时间 = document.querySelector("div.infoOfFund > table > tbody > tr:nth-child(2) > td:nth-child(1)").innerText.replace("成 立 日:", ""); //指数基金年化代替,平均回报计算为成立以来年化 if (setting.指数基金年化代替为成立以来年化) { 平均回报率 = ((Math.pow(累计净值, 1 / (GetNumberOfDays(new Date(), 成立时间) / 365)) - 1) * 100).toFixed(2); } //指数成立时间不满5年则关闭 if(setting.指数用成立时间不满5年则关闭&&成立时间 > setting.满五年日期常量){ window.close(); return; } //不满五年判断 if (setting.自动关闭不满5年基金 && 任职时间 > setting.满五年日期常量) { window.close(); return; } //回报率判断 if (setting.自动关闭平均回报过低基金 && 平均回报率 < setting.回报率常量) { window.close(); return; } //打开新窗口,获取净值 if (setting.是否查看近一年净值) { window.open(净值网址 + "?ref=" + 股票代码, '_blank', "height=100,width=100,top=" + window.screen.height + ",left=" + window.screen.width + ",location=0,menubar=0,status=0,titlebar=0,toolbar=0"); } //持续监听变化 var flag = ""; window.setInterval(() => { //显示基本信息 var 一年前的时间 = GM_getValue(股票代码 + "时间"); var 一年前累计净值 = GM_getValue(股票代码 + "净值"); if (flag === 一年前累计净值) return; flag = 一年前累计净值; var 近一年 = ((累计净值 / 一年前累计净值 - 1) * 100).toFixed(2) + "%"; divElement2.innerHTML = "近一年: " + 近一年 + "<br>净值时间: " + 净值时间 + "<br>累计净值: " + 累计净值 + "<br>取值时间: " + 一年前的时间 + "<br>累计净值: " + 一年前累计净值 + "<br>任职时间: " + 任职时间 + "<br>任期回报: " + 任期回报 + "<br>平均回报: " + 平均回报率 + "%"; }, 100); var flag2, flag3,flag4; window.setInterval(() => { var 当前估值 = parseFloat((document.querySelector("#gz_gszzl").innerText.replace("%", "") / 100).toFixed(4)); //---最大值 var 近一个月最大累计净值时间 = GM_getValue(股票代码 + "近一个月最大累计净值时间"); var 近一个月最大累计净值 = GM_getValue(股票代码 + "近一个月最大累计净值"); var 与月高点的差距 = 1 - 累计净值 * (1 + (当前估值)) / 近一个月最大累计净值; //---最小值 var 近一个月最小累计净值时间 = GM_getValue(股票代码 + "近一个月最小累计净值时间"); var 近一个月最小累计净值 = GM_getValue(股票代码 + "近一个月最小累计净值"); var 与月低点的差距 = 累计净值 * (1 + (当前估值)) / 近一个月最小累计净值 -1; //---值检测 if (flag2 === 近一个月最大累计净值时间 && flag3 === 当前估值&& flag4===近一个月最小累计净值时间) return; flag2 = 近一个月最大累计净值时间; flag3 = 当前估值; flag4 = 近一个月最小累计净值时间; 与月高点的差距 = (与月高点的差距 * 100).toFixed(2) + "%"; 与月低点的差距 = (与月低点的差距 * 100).toFixed(2) + "%"; divElement3.innerHTML = "当前估值: " + (当前估值 * 100).toFixed(2) + "%" + "<br>近一个月最大累计净值:<br>取值时间:" + 近一个月最大累计净值时间 + "<br>累计净值: " + 近一个月最大累计净值 + "<br>与月高点的差距:" + 与月高点的差距+ "<br>近一个月最小累计净值:<br>取值时间:"+ 近一个月最小累计净值时间+ "<br>累计净值: " + 近一个月最小累计净值 + "<br>与月低点的差距:" + 与月低点的差距; }, 100); }, 0); } else if (str2.test(url) && getQueryString("ref") != null) { var ref = getQueryString("ref"); window.setTimeout(() => { //找到近20个交易日累计净值的最大值 var 近20个交易日时间 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(1)"); var 近20个交易日累计净值 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(3)"); var maximumIndex = 0; var minimumIndex=0; for (let key in 近20个交易日累计净值) { if (近20个交易日累计净值[key].innerText > 近20个交易日累计净值[maximumIndex].innerText) { maximumIndex = key; } if (近20个交易日累计净值[key].innerText < 近20个交易日累计净值[minimumIndex].innerText) { minimumIndex = key; } } GM_setValue(ref + "近一个月最大累计净值时间", 近20个交易日时间[maximumIndex].innerText); GM_setValue(ref + "近一个月最大累计净值", 近20个交易日累计净值[maximumIndex].innerText); GM_setValue(ref + "近一个月最小累计净值时间", 近20个交易日时间[minimumIndex].innerText); GM_setValue(ref + "近一个月最小累计净值", 近20个交易日累计净值[minimumIndex].innerText); //找一年前的累计净值 document.querySelector("#pagebar > div.pagebtns > input.pnum").value = 13; document.querySelector("#pagebar > div.pagebtns > input.pgo").click(); window.setTimeout(() => { var 时间 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(1)"); var 净值 = document.querySelectorAll("#jztable > table > tbody > tr > td:nth-child(3)"); GM_setValue(ref + "时间", 时间[2].innerText); GM_setValue(ref + "净值", 净值[2].innerText); window.close(); }, 500); }, 0); } }); addStyle(` .gs1 { padding: 5px 5px; font-size: 14px; color: snow; position: fixed; text-align: left; cursor: copy; border-radius: 10px; background-color: rgba(135, 134, 241, 0.84); right: 5px; top: 15%; z-index: 999999; //box-shadow: 0 0 7px 0 rgba(18, 80, 18,0.4), 0 0 0 1px rgba(0,0,0,0.3); min-width: 144px; }`); /** * 添加浏览器执行事件 * @param func 无参匿名函数 */ function addLoadEvent(func) { let oldOnload = window.onload; if (typeof window.onload != 'function') { window.onload = func; } else { window.onload = function() { try { oldOnload(); } catch (e) { console.log(e); } finally { func(); } } } } /** * 获取网页参数 * @param name 参数名称 * @returns {string|null} */ function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); var r = decodeURI(window.location.search).substr(1).match(reg); if (r != null) return (r[2]); return null; } //添加css样式 function addStyle(rules) { let styleElement = document.createElement('style'); styleElement["type"] = 'text/css'; document.getElementsByTagName('head')[0].appendChild(styleElement); styleElement.appendChild(document.createTextNode(rules)); } /** * 对象排序方法 * @param obj1 * @param obj2 * @returns {number} */ var compare = function(obj1, obj2) { var val1 = obj1.innerText; var val2 = obj2.innerText; if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } }; /** * 两个时间相减,返回天数 * @param date1 较大的日期 * @param date2 较小的日期 * @returns {number} * @constructor */ function GetNumberOfDays(date1, date2) { //获得天数 //date1:开始日期,date2结束日期 var a1 = Date.parse(new Date(date1)); var a2 = Date.parse(new Date(date2)); var day = parseInt((a1 - a2) / (1000 * 60 * 60 * 24)); //核心:时间戳相减,然后除以天数 return day } })();