FundNetValueReminder

基金净值提示

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name    FundNetValueReminder
// @description  基金净值提示
// @version  4.20190311
// @namespace net.jacky-q.userscript
// @grant    GM_xmlhttpRequest
// @grant    GM_setValue
// @grant    GM_getValue
// @require    https://code.jquery.com/jquery-1.12.4.min.js
// @include http://www.1234567.com.cn/
// ==/UserScript==

var MONITOR_LOCATION = "http://fund.eastmoney.com/f10/jjjz_%fund_code%.html";
var MONITOR_INTERVAL = 30 * 1000;
var slowEList = [
{fund_code: '000051',fund_name :'沪深300         ',net_value:0.9752     ,monitor_flag:true,has_alerted:false},
{fund_code: '000478',fund_name :'建信500         ',net_value:2.369644444,monitor_flag:true,has_alerted:false},
{fund_code: '000968',fund_name :'养老产业        ',net_value:0.81128    ,monitor_flag:true,has_alerted:false},
{fund_code: '001051',fund_name :'上证50          ',net_value:0.713775   ,monitor_flag:true,has_alerted:false},
{fund_code: '001052',fund_name :'中证500         ',net_value:0.5201     ,monitor_flag:true,has_alerted:false},
{fund_code: '001180',fund_name :'全指医药        ',net_value:0.777811111,monitor_flag:true,has_alerted:false},
{fund_code: '001469',fund_name :'全指金融        ',net_value:0.9534     ,monitor_flag:true,has_alerted:false},
{fund_code: '003765',fund_name :'广发创业板      ',net_value:0.8037     ,monitor_flag:true,has_alerted:false},
{fund_code: '004752',fund_name :'中证传媒        ',net_value:0.8646     ,monitor_flag:true,has_alerted:false},
{fund_code: '100032',fund_name :'中证红利        ',net_value:0.939130769,monitor_flag:true,has_alerted:false},
{fund_code: '100038',fund_name :'富国300         ',net_value:1.48285    ,monitor_flag:true,has_alerted:false},
{fund_code: '110022',fund_name :'易方达消费行业  ',net_value:1.7156     ,monitor_flag:true,has_alerted:false},
{fund_code: '110026',fund_name :'易方达创业板    ',net_value:1.5638     ,monitor_flag:true,has_alerted:false},
{fund_code: '502010',fund_name :'证券公司        ',net_value:0.8685     ,monitor_flag:true,has_alerted:false},
{fund_code: '164906',fund_name :'中国海外互联    ',net_value:1.2197     ,monitor_flag:true,has_alerted:false},
{fund_code: '000071',fund_name :'恒生指数        ',net_value:1.044      ,monitor_flag:true,has_alerted:false},
{fund_code: '003376',fund_name :'7-10国开债      ',net_value:0.9419     ,monitor_flag:true,has_alerted:false},
{fund_code: '050027',fund_name :'博时信用债      ',net_value:1.0071     ,monitor_flag:true,has_alerted:false},
{fund_code: '110027',fund_name :'易方达安心回报债',net_value:1.5552     ,monitor_flag:true,has_alerted:false},
{fund_code: '270048',fund_name :'广发纯债        ',net_value:1.1317     ,monitor_flag:true,has_alerted:false},
{fund_code: '340001',fund_name :'兴全转债        ',net_value:0.999      ,monitor_flag:true,has_alerted:false},
{fund_code: '519977',fund_name :'长信可转债      ',net_value:1.2011     ,monitor_flag:true,has_alerted:false},
{fund_code: '160416',fund_name :'石油基金        ',net_value:0.7679     ,monitor_flag:true,has_alerted:false},
{fund_code: '000614',fund_name :'德国DAX         ',net_value:1.03135    ,monitor_flag:true,has_alerted:false}
];
var zoneList = [{
    fund_code : "110026",
    fund_name : "易方达创业板ETF联接A",
    net_value : 1.3207,
    monitor_flag : true,
    direction : 'B',
    has_alerted : false
},{
    fund_code : "004752",
    fund_name : "广发中证传媒ETF连接A",
    net_value : 0.6766,
    monitor_flag : true,
    direction : 'B',
    has_alerted : false
}];
var drawdownList = [{

}];
var MONITOR_STRATEGY = {
    SLOW_E :{
        list : slowEList,
        monitorExpress : function (curNetValue, monitorNetValue) {
            return (curNetValue - monitorNetValue) / monitorNetValue <= 0.0;
        },
        giveUpExpress : function (curNetValue,monitorNetValue) {
            return (curNetValue - monitorNetValue)/monitorNetValue > 0.05;
        }
    } ,
    ZONE_FLOW : {
        list : zoneList,
        monitorExpress : function (curNetValue, monitorNetValue,item) {
            return item.direction === 'B' ? curNetValue < monitorNetValue : curNetValue > monitorNetValue;
        },
        giveUpExpress : function (curNetValue,monitorNetValue,item) {
            return item.direction === 'B' ? curFundNet * 0.94 > monitorNetValue : curFundNet < monitorNetValue * 0.94 ;
        }
    },
    DRAW_DOWN : {
        list : drawdownList,
        monitorExpress : function (curNetValue,null_,item){
            var monitorNetValue = GM_getValue('MAXNAV_' + itme.fund_code);
            if (monitorNetValue == null) {
                return false;
            } else {
                if (curNetValue / 1 >= monitorNetValue / 1) {
                    GM_setValue('MAXNAV_' + item.fund_code, curNetValue);
                } else if (monitorNetValue * 0.85 <= curNetValue) {
                    return true;
                }
            }
            return false;
        }
    }
};
var curStrategy = MONITOR_STRATEGY.SLOW_E;

// the guts of this userscript
function main() {
    // console.log(typeof $.ajax);
    setInterval(function () {
        var fundList = loadMonitorItem();
        console.log("当前监控基金数:" +  fundList.length);
        for (var i = 0; i < fundList.length; i++) {
            var d = showAlert(fundList[i]);
            loadNetValue(fundList[i], d);
        }
    }, MONITOR_INTERVAL);


}

function showAlert(item) {
    return function (/*curFundNet*/) {
        // console.log("get data:"+item.fund_name);
        var curFundNet = arguments.length > 0 ? arguments[0] : 10000;
        // console.log(item.fund_name + " net value2 :" + curFundNet);
        // console.log("get diff:" + (curFundNet - item['net_value']) / item['net_value'] );
        if ( curStrategy.monitorExpress(curFundNet,item['net_value'],item.direction)) {
            var tipText = ("!\r\n" + item['fund_name'] + '的净值达到' + curFundNet + ",逼近监视阈值" + item['net_value'] + "\r\n!");
            var subffix = '!!!!!!!!!!!!!!!!!!!!!!!!!!';
            console.log( subffix +  tipText + subffix);
            if(!item.has_alerted){
                alert(tipText);
                updateAlertTip(item);
            }
            //  alert(item['fund_name'] + '的净值达到' + curFundNet + ",逼近监视阈值" + item['net_value'] + "!");
        } 
        if ( curStrategy.giveUpExpress(curFundNet,item['net_value'],item.direction)) {
            removeMonitor(item);
        }

    }
}

function removeMonitor(item) {
    for (var i = 0; i < curStrategy.list.length; i++) {
        if (item['fund_code'] === curStrategy.list[i].fund_code) {
            curStrategy.list[i].monitor_flag = false;
            console.log("移除监控基金:"+item.fund_name);
        }
    }
}
function updateAlertTip(item) {
    for (var i = 0; i < curStrategy.list.length; i++) {
        if (item['fund_code'] === curStrategy.list[i].fund_code) {
            curStrategy.list[i].has_alerted = true;
        }
    }
}

function loadMonitorItem() {
    var list = [];
    for (var i = 0; i < curStrategy.list.length; i++) {
        if(curStrategy.list[i].monitor_flag){
            list.push(curStrategy.list[i]);
        }
    }
    return list;
}

function loadNetValue(item, callback) {
    //console.log("开始获取估算净值" + item.fund_name);
    if(!item.monitor_flag){
        return;
    }
  // console.log(item.fund_name + "当前监控阈值:" + item.net_value);
    var url = MONITOR_LOCATION.replace("%fund_code%", item['fund_code']);
    url +="&tmp=" + new Date().getTime();
    //  console.log("url=" + url);

    $.ajax(url, {
        success: function (data, status, xhr) {
            var net = data.match(/lar bold guzhi">((\d|\.)+)<\/span>/);
          //     console.log(item.fund_name + "当前估值:" + net[1]);
            var fundNet = parseFloat(net[1]);
            //  console.log(item.fund_name + " net value1 :" + fundNet);
            callback(fundNet);
        },
        error: function () {
            console.log("error fetch:"  + item['fund_name']);
        }
    })
    //   var curFundNet = 2.530;
    //   callback.call(curFundNet);

}

// load jQuery and execute the main function
main();
//console.log('script loaded');