Files
mql5_indicators_mt5_part1/CI - indicator for MetaTrader 5/ci.mq5
T

118 lines
9.2 KiB
Plaintext

//+------------------------------------------------------------------+
//| CI.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 "Congestion Identifier indicator"
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
//--- plot CI
#property indicator_label1 "Counter graph"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- plot INC
#property indicator_label2 "Out"
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrGreen
#property indicator_style2 STYLE_SOLID
#property indicator_width2 1
//--- plot DEC
#property indicator_label3 "In"
#property indicator_type3 DRAW_ARROW
#property indicator_color3 clrRed
#property indicator_style3 STYLE_SOLID
#property indicator_width3 1
//--- input parameters
input uint InpPeriod = 28; // Period
input double InpDelta = 100.0; // Delta
input uint InpLevel = 14; // Level
//--- indicator buffers
double BufferCI[];
double BufferINC[];
double BufferDEC[];
//--- global variables
int period;
int level;
double delta;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- set global variables
period=int(InpPeriod<1 ? 1 : InpPeriod);
level=int(InpLevel<1 ? 1 : InpLevel);
delta=(InpDelta<1 ? 1 : InpDelta)*Point();
//--- indicator buffers mapping
SetIndexBuffer(0,BufferCI,INDICATOR_DATA);
SetIndexBuffer(1,BufferINC,INDICATOR_DATA);
SetIndexBuffer(2,BufferDEC,INDICATOR_DATA);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
PlotIndexSetInteger(1,PLOT_ARROW,159);
PlotIndexSetInteger(2,PLOT_ARROW,159);
//--- setting indicator parameters
IndicatorSetString(INDICATOR_SHORTNAME,"Congestion Identifier ("+(string)period+","+DoubleToString(level,1)+","+DoubleToString(delta,1)+")");
IndicatorSetInteger(INDICATOR_DIGITS,0);
IndicatorSetInteger(INDICATOR_LEVELS,1);
IndicatorSetDouble(INDICATOR_LEVELVALUE,level);
IndicatorSetDouble(INDICATOR_MINIMUM,0);
//--- setting buffer arrays as timeseries
ArraySetAsSeries(BufferCI,true);
ArraySetAsSeries(BufferINC,true);
ArraySetAsSeries(BufferDEC,true);
//---
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[])
{
//--- Установка массивов буферов как таймсерий
ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
int limit=rates_total-prev_calculated;
if(limit>1)
{
limit=rates_total-period-2;
ArrayInitialize(BufferCI,EMPTY_VALUE);
ArrayInitialize(BufferINC,EMPTY_VALUE);
ArrayInitialize(BufferDEC,EMPTY_VALUE);
}
//--- Расчёт индикатора
for(int i=limit; i>=0 && !IsStopped(); i--)
{
double top=close[i]+delta;
double bottom=close[i]-delta;
int count=0;
for(int j=0; j<period; j++)
if(close[i+j]<top && close[i+j]>bottom)
count++;
BufferCI[i]=count;
BufferINC[i]=(BufferCI[i+1]<level && BufferCI[i]>level ? level : EMPTY_VALUE);
BufferDEC[i]=(BufferCI[i+1]>level && BufferCI[i]<level ? level : EMPTY_VALUE);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+