azPerf(id;ma;cachetime)
cell B2=2801, cell B3=azPerf(B2;10;5)
rows.push([data.name, data.type, fee, diff, data.changeSinceOneMonth, data.changeSinceThreeMonths,data.changeSinceSixMonths,data.changeSinceOneYear, data.changeSinceThreeYears, data.changeSinceFiveYears, data.startDate]);
rows.push([data.name, data.type, fee, diff,data.NAV,sma,data.sharpeRatio, data.changeSinceOneMonth, data.changeSinceThreeMonths,data.changeSinceSixMonths,data.changeSinceOneYear, data.changeSinceThreeYears, data.changeSinceFiveYears,data.NAVLastUpdated, data.startDate]);
/** * GS AZ-fuldata v1.0.2 */ function azPost(id, ma, single) { var azPost_url = 'https://www.avanza.se/ab/component/highstockchart/getchart/orderbook'; var cacheTime = 32400; // 32400s = 6 hours id = id || false; ma = ma || false; single = single || false; // check if cached var cacheString = 'cache_' + id.toString() + ma + single; var cache = CacheService.getScriptCache(); var cacheData = cache.get(cacheString); if(!id) return 'Inget id definierat'; if(id){ var json = '{"orderbookId":%id%,"chartType":"AREA","widthOfPlotContainer":558,"chartResolution":"MONTH","navigator":true,"percentage":false,"volume":false,"owners":false,"timePeriod":"year","ta":[]}'; json = json.replace('%id%', id); if( ma ){ json = json.replace('[]', '[{"type":"sma","timeFrame": '+ ma +'}]'); } // make the request var options = { 'method' : 'post', 'contentType': 'application/json', 'payload' : json, 'muteHttpExceptions': true }; var response, data; if(cacheData != null) { data = cacheData; } else { response = UrlFetchApp.fetch(azPost_url, options); data = response.getContentText(); cache.put(cacheString, data, cacheTime); // cache for 1 hour } var data = JSON.parse(data); var dataPoints = data.dataPoints; // check if ma set if( ma ) var maData = data.technicalAnalysis[0]['dataPoints']; var rows = [], data, i=0, len = dataPoints.length; for (i; i<len; i++) { cur = dataPoints[i]; var date = cur[0], nav = cur[1]; var jsdate = new Date(date), year = jsdate.getFullYear(), month = jsdate.getMonth() + 1, // jsdate = 0 based index day = jsdate.getDate(); if( month < 10 ) { month = '0' + month; } // add leading zero if( day < 10 ) { day = '0' + day; } // add leading zero var ymd = year +'-'+ month + '-' + day; if( ma ) { var cur_sma; if ( maData[i+1] ){ cur_sma = maData[i+1][1]; // sma-index is index-1 } else { cur_sma = ''; } } // last point did not have ma, must find latest ma (since 1 year data does not include 100% of all MA-points) if( ma && cur_sma === '' ){ var len = maData.length; cur_sma = maData[len-1]; } if( !single ){ if( !ma ) { rows.push([ymd, nav]); } else { rows.push([ymd, nav, cur_sma]); } } else { if( !ma ) { rows.push([nav]); } else { rows.push([nav, cur_sma]); } } } // end loop // set headers if(ma) { rows.unshift(['Datum', 'Kurs', 'MA'+ma]); } else { rows.unshift(['Datum', 'Kurs']); } // check if user wants single (value) if( single ) { var len = rows.length, lastRow = rows[len-1]; rows = [lastRow]; } return rows; } } // azPost() // hämta senaste kurs function azNav(id, ma, res){ return azPost(id, ma, true); } function toPercent(val){ return Math.round(val*10000)/100; } /* hämta 1 mån, 3 mån, 6 mån etc */ function azPerf(id,ma,cacheTime){ id = id || false; ma = ma || 10; cacheTime = cacheTime || 32400; // 6 hours if(!id) return 'no id was set'; var azFund_url = 'https://www.avanza.se/_mobile/market/fund/{id}', azStock_url = 'https://www.avanza.se/_mobile/market/stock/{id}', check_url = 'https://www.avanza.se/_mobile/market/orderbooklist/{id}', response, data, rows = [], url; // options for all requests var options = { "muteHttpExceptions":true }; // first check what type something is, can be either FUND or something else // all 'something' else has a different format, but the *SAME* format // check if cached var cacheString = 'check_' + id.toString() + ma; var cache = CacheService.getScriptCache(); var cacheData = cache.get(cacheString); if( cacheData ){ data = cacheData; } else { check_url = check_url.replace('{id}', id); response = UrlFetchApp.fetch(check_url, options); data = response.getContentText(); cache.put(cacheString, data, cacheTime); } var isFund = true; //return data; data = JSON.parse(data); data = data[0]; var type = data.instrumentType; // check what the instrument type was and act accordingly if( type !== "FUND" ){ isFund = false; } if( !isFund ){ url = azStock_url.replace('{id}', id); // check if cached var cacheString = 'stock_' + id.toString() + ma; var cache = CacheService.getScriptCache(); var cacheData = cache.get(cacheString); if( cacheData ){ data = cacheData; } else { check_url = check_url.replace('{id}', id); response = UrlFetchApp.fetch(url, options); data = response.getContentText(); cache.put(cacheString, data, cacheTime); } data = JSON.parse(data); // not a fund, we must manually calculate returns // and set this to data-object if( data.sellPrice ){ var currentNav = data.sellPrice; // .buyPrice also available (AZ uses sellPrice) } else { var currentNav = data.lastPrice; } data.NAV = currentNav; // add all changeSinceXXX data.changeSinceOneMonth = toPercent((currentNav/data.priceOneMonth)-1); data.changeSinceThreeMonths = toPercent((currentNav/data.priceThreeMonthsAgo)-1); data.changeSinceSixMonths = toPercent((currentNav/data.priceSixMonthsAgo)-1); data.changeSinceOneYear = toPercent((currentNav/data.priceOneYearAgo)-1); data.changeSinceThreeYears = toPercent((currentNav/data.priceThreeYearsAgo)-1); data.changeSinceFiveYears = toPercent((currentNav/data.priceFiveYearsAgo)-1); // add others data.sharpeRatio = '-'; data.NAVLastUpdated = data.lastPriceUpdated; data.startDate = '-'; data.standardDeviation = '-'; data.managementFee = '-'; data.name = data.name + ' (' + data.tickerSymbol + ')'; if( type.indexOf('TRADED_FUND') > -1 ){ data.type = 'ETF'; } else if( type === 'CERTIFICATE'){ data.type = 'Certifikat'; } else if( type === 'INDEX'){ data.type = 'Index'; } else { data.type = 'Aktie'; } } // it's a fund else { // check if cached var cacheString = 'fund_' + id.toString() + ma; var cache = CacheService.getScriptCache(); var cacheData = cache.get(cacheString); if( cacheData ){ data = cacheData; } else { url = azFund_url.replace('{id}',id); response = UrlFetchApp.fetch(url, options); data = response.getContentText(); cache.put(cacheString, data, cacheTime); } data = JSON.parse(data); } var lastUpdate; lastUpdate = data.NAVLastUpdated.split('T')[0]; var nav = azPost(id, ma, true), cur = data.NAV, //cur = nav[0][0], sma = nav[0][1]; if( isNaN(sma) ){ sma = sma[1]; } var diff = Math.round(((cur/sma)-1)*1000)/1000, diff = Math.round(diff*1000)/10 + '%'; var stdDev = data.standardDeviation, fee = data.managementFee; // check for changeSince since some will not have certain values for( var key in data ) { var cur = data[key]; if( key.indexOf('changeSince') > -1 ){ if( isNaN(cur) ){ data[key] = 0; } } } // end loop rows.push([data.name, data.type, fee, diff, data.NAV, sma, data.sharpeRatio, stdDev, data.changeSinceThreeMonths,data.changeSinceSixMonths,data.changeSinceOneYear, data.changeSinceThreeYears, data.changeSinceFiveYears, lastUpdate, data.startDate]); return rows; } function getUERATE(ma, cacheTime) { if (typeof ma !== "number") { ma = 12; } else { ma = ma || 12; } cacheTime = cacheTime || 32400; // 6 hours var cacheString = 'cache_unrate' + ma; var cache = CacheService.getScriptCache(); var cacheData = cache.get(cacheString); var unrate_url = 'https://api.bls.gov/publicAPI/v1/timeseries/data/LNS14000000'; var response; // options for all requests var options = { "muteHttpExceptions": true }; var data; response = UrlFetchApp.fetch(unrate_url, options); if (cacheData != null) { data = cacheData; } else { response = UrlFetchApp.fetch(unrate_url, options); data = response.getContentText(); cache.put(cacheString, data, cacheTime); // cache for 1 hour } data = response.getContentText(); data = JSON.parse(data); if (data.status !== "REQUEST_SUCCEEDED") { return null; } var series = data.Results.series[0].data; if (!Array.isArray(series) || series.length < 1) { return null; } var rows = []; var currUE = parseFloat(series[0].value); if (series.length < ma + 1) { ma = series.length; } var sumRate = 0.0; for (var i = 1; i < ma + 1; i++) { var ueval = parseFloat(series[i].value); sumRate += ueval; } var smarate = sumRate / (ma); smarate = Math.round(smarate * 100) / 100; //unrate = Math.round(unrate * 100) / 100 rows.push(["US UE Rate:", currUE.toFixed(2)]); rows.push(["SMA" + ma + ":", smarate.toFixed(2)]); rows.push(["Recession likely?", smarate > currUE ? "No" : "Yes"]); return rows; }
Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!
Swish: 123 536 99 96 Bankgiro: 211-4106
Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!
Swish: 123 536 99 96 Bankgiro: 211-4106