Advertisement
AndrejSz

RSI with EMA

Jun 11th, 2024
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 2.45 KB | Source Code | 0 0
  1. function calculateRSIAndEMA() {
  2.   var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
  3.   var range = sheet.getRange("B2:B");
  4.   var data = range.getValues();
  5.  
  6.   // Read lengths from cells G2 and G4
  7.   var rsiPeriod = sheet.getRange("G2").getValue();
  8.   var emaPeriod = sheet.getRange("G4").getValue();
  9.  
  10.   var closingPrices = [];
  11.   for (var i = 0; i < data.length; i++) {
  12.     if (data[i][0] == '') break; // Stop if an empty cell is encountered
  13.     closingPrices.push(data[i][0]);
  14.   }
  15.  
  16.   var rsi = calculateRSIArray(closingPrices, rsiPeriod);
  17.   var ema = calculateEMA(rsi, emaPeriod);
  18.  
  19.   // Write RSI to column C and EMA of RSI to column D
  20.   for (var j = 0; j < closingPrices.length; j++) {
  21.     if (j < rsiPeriod) {
  22.       sheet.getRange(j + 2, 3).setValue("-");
  23.       sheet.getRange(j + 2, 4).setValue("-");
  24.     } else {
  25.       sheet.getRange(j + 2, 3).setValue(rsi[j - rsiPeriod]);
  26.       if (j < rsiPeriod + emaPeriod - 1) {
  27.         sheet.getRange(j + 2, 4).setValue("-");
  28.       } else {
  29.         sheet.getRange(j + 2, 4).setValue(ema[j - rsiPeriod - (emaPeriod - 1)]);
  30.       }
  31.     }
  32.   }
  33. }
  34.  
  35. function calculateRSIArray(closingPrices, period) {
  36.   var rsiArray = [];
  37.   var gain = 0;
  38.   var loss = 0;
  39.  
  40.   for (var i = 1; i <= period; i++) {
  41.     var change = closingPrices[i] - closingPrices[i - 1];
  42.     if (change > 0) {
  43.       gain += change;
  44.     } else {
  45.       loss -= change;
  46.     }
  47.   }
  48.  
  49.   gain = gain / period;
  50.   loss = loss / period;
  51.  
  52.   if (loss == 0) {
  53.     rsiArray.push(100);
  54.   } else {
  55.     var rs = gain / loss;
  56.     rsiArray.push(100 - (100 / (1 + rs)));
  57.   }
  58.  
  59.   for (var j = period; j < closingPrices.length; j++) {
  60.     var change = closingPrices[j] - closingPrices[j - 1];
  61.     if (change > 0) {
  62.       gain = (gain * (period - 1) + change) / period;
  63.       loss = (loss * (period - 1)) / period;
  64.     } else {
  65.       gain = (gain * (period - 1)) / period;
  66.       loss = (loss * (period - 1) - change) / period;
  67.     }
  68.  
  69.     if (loss == 0) {
  70.       rsiArray.push(100);
  71.     } else {
  72.       rs = gain / loss;
  73.       rsiArray.push(100 - (100 / (1 + rs)));
  74.     }
  75.   }
  76.  
  77.   return rsiArray;
  78. }
  79.  
  80. function calculateEMA(data, period) {
  81.   var emaArray = [];
  82.   var k = 2 / (period + 1);
  83.  
  84.   // Start EMA with the first available RSI value
  85.   var ema = data[0];
  86.   emaArray.push(ema);
  87.  
  88.   for (var i = 1; i < data.length; i++) {
  89.     ema = data[i] * k + ema * (1 - k);
  90.     emaArray.push(ema);
  91.   }
  92.  
  93.   return emaArray;
  94. }
  95.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement