Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function calculateRSIAndEMA() {
- var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
- var range = sheet.getRange("B2:B");
- var data = range.getValues();
- // Read lengths from cells G2 and G4
- var rsiPeriod = sheet.getRange("G2").getValue();
- var emaPeriod = sheet.getRange("G4").getValue();
- var closingPrices = [];
- for (var i = 0; i < data.length; i++) {
- if (data[i][0] == '') break; // Stop if an empty cell is encountered
- closingPrices.push(data[i][0]);
- }
- var rsi = calculateRSIArray(closingPrices, rsiPeriod);
- var ema = calculateEMA(rsi, emaPeriod);
- // Write RSI to column C and EMA of RSI to column D
- for (var j = 0; j < closingPrices.length; j++) {
- if (j < rsiPeriod) {
- sheet.getRange(j + 2, 3).setValue("-");
- sheet.getRange(j + 2, 4).setValue("-");
- } else {
- sheet.getRange(j + 2, 3).setValue(rsi[j - rsiPeriod]);
- if (j < rsiPeriod + emaPeriod - 1) {
- sheet.getRange(j + 2, 4).setValue("-");
- } else {
- sheet.getRange(j + 2, 4).setValue(ema[j - rsiPeriod - (emaPeriod - 1)]);
- }
- }
- }
- }
- function calculateRSIArray(closingPrices, period) {
- var rsiArray = [];
- var gain = 0;
- var loss = 0;
- for (var i = 1; i <= period; i++) {
- var change = closingPrices[i] - closingPrices[i - 1];
- if (change > 0) {
- gain += change;
- } else {
- loss -= change;
- }
- }
- gain = gain / period;
- loss = loss / period;
- if (loss == 0) {
- rsiArray.push(100);
- } else {
- var rs = gain / loss;
- rsiArray.push(100 - (100 / (1 + rs)));
- }
- for (var j = period; j < closingPrices.length; j++) {
- var change = closingPrices[j] - closingPrices[j - 1];
- if (change > 0) {
- gain = (gain * (period - 1) + change) / period;
- loss = (loss * (period - 1)) / period;
- } else {
- gain = (gain * (period - 1)) / period;
- loss = (loss * (period - 1) - change) / period;
- }
- if (loss == 0) {
- rsiArray.push(100);
- } else {
- rs = gain / loss;
- rsiArray.push(100 - (100 / (1 + rs)));
- }
- }
- return rsiArray;
- }
- function calculateEMA(data, period) {
- var emaArray = [];
- var k = 2 / (period + 1);
- // Start EMA with the first available RSI value
- var ema = data[0];
- emaArray.push(ema);
- for (var i = 1; i < data.length; i++) {
- ema = data[i] * k + ema * (1 - k);
- emaArray.push(ema);
- }
- return emaArray;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement