Price Data Components
Indicators Used
1
Views
0
Downloads
0
Favorites
Choppiness_IndexH
ÿþ//+------------------------------------------------------------------+
//| Choppiness_IndexH.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://mql5.com"
#property version "1.00"
#property description "Choppiness Index Histogram oscillator"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 1
//--- plot CI
#property indicator_label1 "CIH"
#property indicator_type1 DRAW_COLOR_HISTOGRAM
#property indicator_color1 clrGreen,clrLimeGreen,clrLightSteelBlue,clrDodgerBlue,clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- input parameters
input uint InpPeriod = 14; // Period
input double InpLevelTrend = -11.8; // Trend level
input double InpLevelChoppy = 11.8; // Choppiness level
input double InpLevelCons = 50.0; // Consolidation level
//--- indicator buffers
double BufferCIH[];
double BufferColors[];
double BufferATR[];
//--- global variables
double l10x;
int period_ind;
int handle_atr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- set global variables
period_ind=int(InpPeriod<1 ? 1 : InpPeriod);
l10x=log10((double)period_ind);
//--- indicator buffers mapping
SetIndexBuffer(0,BufferCIH,INDICATOR_DATA);
SetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX);
SetIndexBuffer(2,BufferATR,INDICATOR_CALCULATIONS);
//--- setting indicator parameters
IndicatorSetString(INDICATOR_SHORTNAME,"Choppiness Index Histogram("+(string)period_ind+")");
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
IndicatorSetInteger(INDICATOR_LEVELS,3);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,InpLevelCons);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,InpLevelChoppy);
IndicatorSetDouble(INDICATOR_LEVELVALUE,2,InpLevelTrend);
IndicatorSetString(INDICATOR_LEVELTEXT,0,"Consolidation");
IndicatorSetString(INDICATOR_LEVELTEXT,1,"Choppiness");
IndicatorSetString(INDICATOR_LEVELTEXT,2,"Trend");
//--- setting buffer arrays as timeseries
ArraySetAsSeries(BufferCIH,true);
ArraySetAsSeries(BufferColors,true);
ArraySetAsSeries(BufferATR,true);
//--- create MA's handles
ResetLastError();
handle_atr=iATR(NULL,PERIOD_CURRENT,1);
if(handle_atr==INVALID_HANDLE)
{
Print("The iATR(1) object was not created: Error ",GetLastError());
return INIT_FAILED;
}
//---
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[])
{
//--- #AB0=>2:0 <0AA82>2 1CD5@>2 :0: B09<A5@89
ArraySetAsSeries(high,true);
ArraySetAsSeries(low,true);
//--- @>25@:0 8 @0AGQB :>;8G5AB20 ?@>AG8BK205<KE 10@>2
if(rates_total<fmax(period_ind,4)) return 0;
//--- @>25@:0 8 @0AGQB :>;8G5AB20 ?@>AG8BK205<KE 10@>2
int limit=rates_total-prev_calculated;
if(limit>1)
{
limit=rates_total-period_ind-1;
ArrayInitialize(BufferCIH,EMPTY_VALUE);
ArrayInitialize(BufferATR,0);
}
//--- >43>B>2:0 40==KE
int count=(limit>1 ? rates_total : 1),copied=0;
copied=CopyBuffer(handle_atr,0,0,count,BufferATR);
if(copied!=count) return 0;
//--- 0AGQB 8=48:0B>@0
for(int i=limit; i>=0 && !IsStopped(); i--)
{
int bl=Lowest(period_ind,i);
int bh=Highest(period_ind,i);
if(bl==WRONG_VALUE || bh==WRONG_VALUE)
continue;
double min=low[bl];
double max=high[bh];
double s=period_ind*GetSMA(rates_total,i,period_ind,BufferATR);
BufferCIH[i]=(max!=min ? 100.0*log10(s/(max-min))/l10x-50.0 : 0);
BufferColors[i]=
(
BufferCIH[i]<=InpLevelTrend ? 0 :
BufferCIH[i]>InpLevelTrend && BufferCIH[i]<0 ? 1 :
BufferCIH[i]>=0 && BufferCIH[i]<InpLevelChoppy ? 2 :
BufferCIH[i]>=InpLevelChoppy && BufferCIH[i]<InpLevelCons ? 3 : 4
);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A <0:A8<0;L=>3> 7=0G5=8O B09<A5@88 High |
//+------------------------------------------------------------------+
int Highest(const int count,const int start)
{
double array[];
ArraySetAsSeries(array,true);
return(CopyHigh(Symbol(),PERIOD_CURRENT,start,count,array)==count ? ArrayMaximum(array)+start : WRONG_VALUE);
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A <8=8<0;L=>3> 7=0G5=8O B09<A5@88 Low |
//+------------------------------------------------------------------+
int Lowest(const int count,const int start)
{
double array[];
ArraySetAsSeries(array,true);
return(CopyLow(Symbol(),PERIOD_CURRENT,start,count,array)==count ? ArrayMinimum(array)+start : WRONG_VALUE);
return WRONG_VALUE;
}
//+------------------------------------------------------------------+
//| Simple Moving Average |
//+------------------------------------------------------------------+
double GetSMA(const int rates_total,const int index,const int period,const double &price[],const bool as_series=true)
{
//---
double result=0.0;
//--- check position
bool check_index=(as_series ? index<=rates_total-period-1 : index>=period-1);
if(period<1 || !check_index)
return 0;
//--- calculate value
for(int i=0; i<period; i++)
result=result+(as_series ? price[index+i]: price[index-i]);
//---
return(result/period);
}
//+------------------------------------------------------------------+
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---