azzx_ema_rsi_1_0

0 Views
0 Downloads
0 Favorites
azzx_ema_rsi_1_0
// ---------------------------------------------------------------------------
//  Ðàññ÷¸ò RSI ïî êíèãå ×.Ëåáî è Ä.Ëóêàñà, äëÿ óñðåäíåíèÿ èñïîëüçóåòñÿ EMA.
// ---------------------------------------------------------------------------

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  Green
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1  30
#property indicator_level2  70

// Ïåðèîä èíäèêàòîðà.
extern int PERIOD = 9;

// Áóôåðû èíäèêàòîðà.
double buf_rsi[], buf_up[], buf_dn[];
// Êîýôôèöèåíòû ðàñ÷¸òà ñðåäíåé.
double k0, k1;
// Ðàáî÷èé ïåðèîä èíäèêàòîðà.
int work_period;

// Èíèöèàëèçàöèÿ.
int init() {
  IndicatorShortName(StringConcatenate(
    "AZZX - EMA RSI v1.0 (", PERIOD, ")"));
  IndicatorDigits(0);
  IndicatorBuffers(3);
  
  SetIndexBuffer(0, buf_rsi);
  SetIndexEmptyValue(0, -1);
  SetIndexLabel(0, "EMA RSI(" + PERIOD + ")");
  
  SetIndexBuffer(1, buf_up);
  SetIndexBuffer(2, buf_dn);
  
  work_period = Bars - PERIOD - 1;
 
  k0 = 2.0 / (PERIOD + 1);
  k1 = 1.0 - k0;

  return(0);
}

// Ãëàâíûé öèêë.
int start() {
  int    i;
  double v;
  
  for(i = Bars - IndicatorCounted() - 1; i >= 0; i--) {
    if(i < work_period) {
      v = Close[i] - Open[i];
      
      if(v > 0) {
        buf_up[i] = v * k0 + buf_up[i + 1] * k1;
        buf_dn[i] =          buf_dn[i + 1] * k1;
      } else {
        buf_up[i] =          buf_up[i + 1] * k1;
        buf_dn[i] = v * k0 + buf_dn[i + 1] * k1;
      }
      
      buf_rsi[i] = buf_up[i] / (buf_up[i] - buf_dn[i]) * 100;
    } else if(i == work_period) {
      // Èíèöèàëèçàöèÿ íà÷àëüíûì çíà÷åíèåì áóôåðîâ.
      int j;
      double u = 0, d = 0;
      
      for(j = i + PERIOD - 1; j >= i; j--) {
        u += buf_up[j];
        d += buf_dn[j];
      }
      
      buf_up[i] = u / PERIOD;
      buf_dn[i] = d / PERIOD;
    } else {
      // Íà÷àëüíûõ äàííûõ íåò.
      buf_rsi[i] = -1;
      
      v = Close[i] - Open[i];
      
      if(v > 0) {
        buf_up[i] = v;
        buf_dn[i] = 0;
      } else {
        buf_up[i] = 0;
        buf_dn[i] = -v;
      }
    }
  }

  return(0);
}

Comments