-
Notifications
You must be signed in to change notification settings - Fork 1
/
ema-levels.mq5
80 lines (75 loc) · 3.35 KB
/
ema-levels.mq5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//------------------------------------------------------------------
#property copyright "© mladen, 2018"
#property link "[email protected]"
#property version "1.00"
//------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots 3
#property indicator_label1 "up level"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrLimeGreen
#property indicator_style1 STYLE_DOT
#property indicator_label2 "down level"
#property indicator_type2 DRAW_LINE
#property indicator_color2 clrOrange
#property indicator_style2 STYLE_DOT
#property indicator_label3 "EMA"
#property indicator_type3 DRAW_COLOR_LINE
#property indicator_color3 clrSilver,clrLimeGreen,clrOrange
#property indicator_width3 2
input int inpEmaPeriod=9; // Ema period
double val[],valc[],levelUp[],levelDn[];
//------------------------------------------------------------------
//
//------------------------------------------------------------------
void OnInit()
{
SetIndexBuffer(0,levelUp,INDICATOR_DATA);
SetIndexBuffer(1,levelDn,INDICATOR_DATA);
SetIndexBuffer(2,val,INDICATOR_DATA);
SetIndexBuffer(3,valc,INDICATOR_COLOR_INDEX);
for(int i=0; i<2; i++) PlotIndexSetInteger(i,PLOT_SHOW_DATA,false);
IndicatorSetString(INDICATOR_SHORTNAME,"Ema levels ("+(string)inpEmaPeriod+")");
}
//------------------------------------------------------------------
//
//------------------------------------------------------------------
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[])
{
if(Bars(_Symbol,_Period)<rates_total) return(-1);
double alpha=2.0/(1.0+inpEmaPeriod);
int i=(int)MathMax(prev_calculated-1,0); for(; i<rates_total && !_StopFlag; i++)
{
val[i] = iEma(close[i],inpEmaPeriod,i,rates_total,0);
levelUp[i] = (i>0) ? (val[i]>levelDn[i-1]) ? levelUp[i-1]+alpha*(val[i]-levelUp[i-1]) : levelUp[i-1] : val[i];
levelDn[i] = (i>0) ? (val[i]<levelUp[i-1]) ? levelDn[i-1]+alpha*(val[i]-levelDn[i-1]) : levelDn[i-1] : val[i];
valc[i] = (val[i]>levelUp[i]) ? 1 : (val[i]<levelDn[i]) ? 2 : (i>0) ? (val[i]==val[i-1]) ? valc[i-1]: 0 : 0;
}
return(i);
}
//+------------------------------------------------------------------+
//| Custom functions |
//+------------------------------------------------------------------+
double workEma[][1];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double iEma(double price,double period,int r,int _bars,int instanceNo=0)
{
if(ArrayRange(workEma,0)!=_bars) ArrayResize(workEma,_bars);
workEma[r][instanceNo]=price;
if(r>0 && period>1)
workEma[r][instanceNo]=workEma[r-1][instanceNo]+(2.0/(1.0+period))*(price-workEma[r-1][instanceNo]);
return(workEma[r][instanceNo]);
}
//+------------------------------------------------------------------+