// ==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
}
})();