azzx_emavol_1_0

0 Views
0 Downloads
0 Favorites
azzx_emavol_1_0
// ---------------------------------------------------------------------------
//  ×îòà çàõîòåëîñü âñïîìíèòü... EMA îò îáú¸ìîâ ïî áàðàì, ðàçëîæåííûõ íà
//  äâèæåíèå ââåðõ è âíèç ïî ìåòîäó "êðàò÷àéøåãî ïóòè".
// ---------------------------------------------------------------------------

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1  PaleGreen
#property indicator_color2  Red
#property indicator_color3  Blue
#property indicator_width1  3
#property indicator_width2  2
#property indicator_width3  2
#property indicator_minimum 0

// Ïåðèîä óñðåäíåíèÿ èíäèêàòîðà.
extern int PERIOD = 15;

// Áóôåðû èíäèêàòîðà.
double buf_av[], buf_up[], buf_dn[];
// Êîýôôèöèåíòû EMA.
double ema_k0, ema_k1;
// Ðàáî÷èé ïåðèîä.
int    work_period;

// Èíèöèàëèçàöèÿ.
int init() {
  IndicatorShortName(StringConcatenate(
    "AZZX - EMA VOLUME (", PERIOD, ")"));
  IndicatorDigits(0);

  SetIndexBuffer(0, buf_av);  
  SetIndexBuffer(1, buf_up);
  SetIndexBuffer(2, buf_dn);
  
  SetIndexEmptyValue(0, -1);
  SetIndexEmptyValue(1, -1);
  SetIndexEmptyValue(2, -1);
  
  SetIndexLabel(0, "HALF OF AVERAGE VOLUME");
  SetIndexLabel(1, "UP VOLUME");
  SetIndexLabel(2, "DOWN VOLUME");

  ema_k0 = 2.0 / (PERIOD + 1);
  ema_k1 = 1.0 - ema_k0;
  
  work_period = Bars - PERIOD - 2;

  return(0);
}

// Ãëàâíûé öèêë.
int start() {
  int    i, j;
  double u, d;
  
  for(i = Bars - IndicatorCounted() - 1; i >= 0; i--) {
    if(i > work_period) {
      buf_av[i] = -1;
      buf_up[i] = -1;
      buf_dn[i] = -1;
    } else if(i == work_period) {
      buf_av[i] = 0;
      buf_up[i] = 0;
      buf_dn[i] = 0;
      
      for(j = Bars - 1; j >= i; j--) {
        calc(j, u, d);
      
        buf_av[i] += 0.5 * Volume[j];
        buf_up[i] += u   * Volume[j];
        buf_dn[i] += d   * Volume[j];
      }
      
      buf_av[i] /= PERIOD;
      buf_up[i] /= PERIOD;
      buf_dn[i] /= PERIOD;
    } else {
      calc(i, u, d);
      
      buf_av[i] = buf_av[i + 1] * ema_k1 + 0.5 * Volume[i] * ema_k0;
      buf_up[i] = buf_up[i + 1] * ema_k1 + u   * Volume[i] * ema_k0;
      buf_dn[i] = buf_dn[i + 1] * ema_k1 + d   * Volume[i] * ema_k0;
    }
  }

  return(0);
}

// Ðàñ÷¸ò âåëè÷èí äëÿ áàðà.
void calc(int bar, double &up, double &dn) {
  if(High[bar] == Low[bar]) {
    up = 0;
    dn = 0;
    
    return;
  }

  double range = High[bar] - Low[bar];
  double path  = 2.0 * range - MathAbs(Open[bar] - Close[bar]);

  if(Close[bar] > Open[bar]) {
    up = range / path;
    dn = 1.0 - up;
  } else {
    dn = range / path;
    up = 1.0 - dn;
  }
}

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---