AvgBodySize

Author: AlexALL
0 Views
0 Downloads
0 Favorites
AvgBodySize
//+------------------------------------------------------------------+
//|                                               AvgBodyCandles.mq4 |
//|                                                          AlexALL |
//|                                                 alex-all@mail.ru |
//+------------------------------------------------------------------+
#property copyright "AlexALL"
#property link      "alex-all@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   4
//--- plot avgBody
#property indicator_label1  "avgBody"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDarkViolet
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- plot Body
#property indicator_label2  "Body"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot UpTail
#property indicator_label3  "UpTail"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrGreen
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2
//--- plot DownTail
#property indicator_label4  "DownTail"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//--- input parameters
input uint      period=170;
input uint      _periodUP=0;
input uint      _periodDOWN=0;

//--- indicator buffers
double         avgBodyBuffer[];
double         BodyBuffer[];
double         UpTailBuffer[];
double         DownTailBuffer[];
double         UpTailBuffer2[];
double         DownTailBuffer2[];

uint periodDOWN,periodUP;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   if(_periodDOWN==0)
      periodDOWN=period;
   else
      periodDOWN=_periodDOWN;
   if(_periodUP==0)
      periodUP=period;
   else
      periodUP=_periodUP;
   SetIndexBuffer(0,avgBodyBuffer);
   SetIndexBuffer(1,BodyBuffer);
   SetIndexBuffer(2,UpTailBuffer);
   SetIndexBuffer(3,DownTailBuffer);
   SetIndexBuffer(0,avgBodyBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,BodyBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,UpTailBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,DownTailBuffer,INDICATOR_DATA);
   SetIndexBuffer(4,UpTailBuffer2,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,DownTailBuffer2,INDICATOR_CALCULATIONS);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i,limit,limitUP,limitDOWN;
//--- check for bars count and input parameter
   if(rates_total<=period || period<=0)
      return(0);
//--- counting from 0 to rates_total
   ArraySetAsSeries(avgBodyBuffer,false);
   ArraySetAsSeries(BodyBuffer,false);
   ArraySetAsSeries(UpTailBuffer,false);
   ArraySetAsSeries(DownTailBuffer,false);
   ArraySetAsSeries(UpTailBuffer2,false);
   ArraySetAsSeries(DownTailBuffer2,false);

//---
   if(prev_calculated==0)
     {
      avgBodyBuffer[0]=0.0;
      //BodyBuffer[0]=0.0;
      UpTailBuffer[0]=0.0;
      UpTailBuffer[0]=0.0;

      //--- filling out the array of True Range values for each period
      for(i=0; i<rates_total; i++)
        {
         BodyBuffer[i]=MathAbs(close[i]-open[i]);
         UpTailBuffer2[i]=high[i]-MathMax(close[i],open[i]);
         DownTailBuffer2[i]=MathMin(close[i],open[i])-low[i];
        }
      //--- first AtrPeriod values of the indicator are not calculated
      double firstValue=0.0;
      double firstValueUP=0.0;
      double firstValueDOWN=0.0;
      for(i=1; i<=period; i++)
        {
         avgBodyBuffer[i]=0.0;
         firstValue+=BodyBuffer[i];
        }
      for(i=1; i<=periodUP; i++)
        {
         UpTailBuffer[i]=0.0;
         firstValueUP+=UpTailBuffer2[i];
        }
      for(i=1; i<=periodDOWN; i++)
        {
         DownTailBuffer[i]=0.0;
         firstValueDOWN+=DownTailBuffer2[i];
        }

      //--- calculating the first value of the indicator
      firstValue/=period;
      avgBodyBuffer[period]=firstValue;
      firstValueDOWN/=   periodDOWN   ;
      DownTailBuffer[periodDOWN]=firstValueDOWN;
      firstValueUP/=   periodUP   ;
      UpTailBuffer[periodUP]=firstValueUP;

      limit=period+1;
      limitUP=periodUP+1;
      limitDOWN=periodDOWN+1;
     }
   else
     {
      limit=prev_calculated-1;
      limitUP=prev_calculated-1;
      limitDOWN=prev_calculated-1;
     }
//--- the main loop of calculations
   for(i=limit; i<rates_total; i++)
     {
      BodyBuffer[i]=MathAbs(close[i]-open[i]);
      avgBodyBuffer[i]=avgBodyBuffer[i-1]+(BodyBuffer[i]-BodyBuffer[i-period])/period;

     }
   for(i=limitUP; i<rates_total; i++)
     {
      UpTailBuffer2[i]=high[i]-MathMax(close[i],open[i]);
      UpTailBuffer[i]=UpTailBuffer[i-1]+(UpTailBuffer2[i]-UpTailBuffer2[i-periodUP])/periodUP;

     }
   for(i=limitDOWN; i<rates_total; i++)
     {
      DownTailBuffer2[i]=MathMin(close[i],open[i])-low[i];
      DownTailBuffer[i]=DownTailBuffer[i-1]+(DownTailBuffer2[i]-DownTailBuffer2[i-periodDOWN])/periodDOWN;

     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

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 ---