View difference between Paste ID: qYnZQ7Ep and hRpeCwRc
SHOW: | | - or go back to the newest paste.
1
//+------------------------------------------------------------------+
2
//|                                                          ADX.mq5 |
3
//|                        Copyright 2009, MetaQuotes Software Corp. |
4
//|                                              http://www.mql5.com |
5
//+------------------------------------------------------------------+
6
#property copyright   "2009, MetaQuotes Software Corp."
7
#property link        "http://www.mql5.com"
8
#property description "Average Directional Movement Index"
9
#include <MovingAverages.mqh>
10
11
#property indicator_separate_window
12
#property indicator_buffers 6
13
#property indicator_plots   3
14
#property indicator_type1   DRAW_LINE
15
#property indicator_color1  LightSeaGreen
16
#property indicator_style1  STYLE_SOLID
17
#property indicator_width1  1
18
#property indicator_type2   DRAW_LINE
19
#property indicator_color2  YellowGreen
20
#property indicator_style2  STYLE_DOT
21
#property indicator_width2  1
22
#property indicator_type3   DRAW_LINE
23
#property indicator_color3  Wheat
24
#property indicator_style3  STYLE_DOT
25
#property indicator_width3  1
26
#property indicator_label1  "ADX"
27
#property indicator_label2  "+DI"
28
#property indicator_label3  "-DI"
29
//--- input parameters
30
input int InpPeriodADX=14; // Period
31
input int    TriggerCandle 	= 0;
32
input bool   EnableNativeAlerts = true;
33
input bool   EnableSoundAlerts  = true;
34
input string AlertText  	= "ADX_Crossing";
35
input string SoundFileName	= "alert.wav";
36
datetime LastAlertTime = D'01.01.1970';
37
int LastAlertDirection = 0;
38
//---- buffers
39
double    ExtADXBuffer[];
40
double    ExtPDIBuffer[];
41
double    ExtNDIBuffer[];
42
double    ExtPDBuffer[];
43
double    ExtNDBuffer[];
44
double    ExtTmpBuffer[];
45
//--- global variables
46
int       ExtADXPeriod;
47
//+------------------------------------------------------------------+
48
//| Custom indicator initialization function                         |
49
//+------------------------------------------------------------------+
50
void OnInit()
51
  {
52
//--- check for input parameters
53
   if(InpPeriodADX>=100 || InpPeriodADX<=0)
54
     {
55
      ExtADXPeriod=14;
56
      printf("Incorrect value for input variable Period_ADX=%d. Indicator will use value=%d for calculations.",InpPeriodADX,ExtADXPeriod);
57
     }
58
   else ExtADXPeriod=InpPeriodADX;
59
//---- indicator buffers
60
   SetIndexBuffer(0,ExtADXBuffer);
61
   SetIndexBuffer(1,ExtPDIBuffer);
62
   SetIndexBuffer(2,ExtNDIBuffer);
63
   SetIndexBuffer(3,ExtPDBuffer,INDICATOR_CALCULATIONS);
64
   SetIndexBuffer(4,ExtNDBuffer,INDICATOR_CALCULATIONS);
65
   SetIndexBuffer(5,ExtTmpBuffer,INDICATOR_CALCULATIONS);
66
//--- indicator digits
67
   IndicatorSetInteger(INDICATOR_DIGITS,2);
68
//--- set draw begin
69
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtADXPeriod<<1);
70
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,ExtADXPeriod);
71
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,ExtADXPeriod);
72
//--- indicator short name
73
   string short_name="ADX("+string(ExtADXPeriod)+")";
74
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
75
//--- change 1-st index label
76
   PlotIndexSetString(0,PLOT_LABEL,short_name);
77
//---- end of initialization function
78
  }
79
//+------------------------------------------------------------------+
80
//| Custom indicator iteration function                              |
81
//+------------------------------------------------------------------+
82
int OnCalculate(const int rates_total,
83
                const int prev_calculated,
84
                const datetime &time[],
85
                const double &open[],
86
                const double &high[],
87
                const double &low[],
88
                const double &close[],
89
                const long &tick_volume[],
90
                const long &volume[],
91
                const int &spread[])
92
  {
93
//--- checking for bars count
94
   if(rates_total<ExtADXPeriod)
95
      return(0);
96
//--- detect start position
97
   int start;
98
   if(prev_calculated>1) start=prev_calculated-1;
99
   else
100
     {
101
      start=1;
102
      ExtPDIBuffer[0]=0.0;
103
      ExtNDIBuffer[0]=0.0;
104
      ExtADXBuffer[0]=0.0;
105
     }
106
//--- main cycle
107
   for(int i=start;i<rates_total && !IsStopped();i++)
108
     {
109
      //--- get some data
110
      double Hi    =high[i];
111
      double prevHi=high[i-1];
112
      double Lo    =low[i];
113
      double prevLo=low[i-1];
114
      double prevCl=close[i-1];
115
      //--- fill main positive and main negative buffers
116
      double dTmpP=Hi-prevHi;
117
      double dTmpN=prevLo-Lo;
118
      if(dTmpP<0.0)   dTmpP=0.0;
119
      if(dTmpN<0.0)   dTmpN=0.0;
120
      if(dTmpP>dTmpN) dTmpN=0.0;
121
      else
122
        {
123
         if(dTmpP<dTmpN) dTmpP=0.0;
124
         else
125
           {
126
            dTmpP=0.0;
127
            dTmpN=0.0;
128
           }
129
        }
130
      //--- define TR
131
      double tr=MathMax(MathMax(MathAbs(Hi-Lo),MathAbs(Hi-prevCl)),MathAbs(Lo-prevCl));
132
      //---
133
      if(tr!=0.0)
134
        {
135
         ExtPDBuffer[i]=100.0*dTmpP/tr;
136
         ExtNDBuffer[i]=100.0*dTmpN/tr;
137
        }
138
      else
139
        {
140
         ExtPDBuffer[i]=0.0;
141
         ExtNDBuffer[i]=0.0;
142
        }
143
      //--- fill smoothed positive and negative buffers
144
      ExtPDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtPDIBuffer[i-1],ExtPDBuffer);
145
      ExtNDIBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtNDIBuffer[i-1],ExtNDBuffer);
146
      //--- fill ADXTmp buffer
147
      double dTmp=ExtPDIBuffer[i]+ExtNDIBuffer[i];
148
      if(dTmp!=0.0)
149
         dTmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/dTmp);
150
      else
151
         dTmp=0.0;
152
      ExtTmpBuffer[i]=dTmp;
153
      //--- fill smoothed ADX buffer
154
      ExtADXBuffer[i]=ExponentialMA(i,ExtADXPeriod,ExtADXBuffer[i-1],ExtTmpBuffer);
155
     }
156
//---- OnCalculate done. Return new prev_calculated.
157
if (((TriggerCandle > 0) && (time[rates_total - 1] > LastAlertTime)) || (TriggerCandle == 0))
158
{
159
	string Text;
160-
	if ((ExtPDIBuffer[rates_total - 1 - TriggerCandle] > 20) && (ExtPDIBuffer[rates_total - 2 - TriggerCandle] <= 40))
160+
161
	if (((ExtPDIBuffer[rates_total - 1 - TriggerCandle] > 20) && (ExtPDIBuffer[rates_total - 2 - TriggerCandle] <= 40)) && ((TriggerCandle > 0) || ((TriggerCandle == 0) && (LastAlertDirection != 1))))
162
	{
163
		Text = AlertText + "ExtPDIBuffer: " + Symbol() + " - " + EnumToString(Period()) + " - Above Zero.";
164
		if (EnableNativeAlerts) Alert(Text);
165
		if (EnableSoundAlerts) PlaySound(SoundFileName);
166
		LastAlertTime = time[rates_total - 1];
167
		LastAlertDirection = 1;
168-
	if ((ExtPDIBuffer[rates_total - 1 - TriggerCandle] < 20) && (ExtPDIBuffer[rates_total - 2 - TriggerCandle] >= 40))
168+
169
	// Below Zero Alert
170
	if (((ExtPDIBuffer[rates_total - 1 - TriggerCandle] < 20) && (ExtPDIBuffer[rates_total - 2 - TriggerCandle] >= 40)) && ((TriggerCandle > 0) || ((TriggerCandle == 0) && (LastAlertDirection != -1))))
171
	{
172
		Text = AlertText + "ExtPDIBuffer: " + Symbol() + " - " + EnumToString(Period()) + " - Below Zero.";
173
		if (EnableNativeAlerts) Alert(Text);
174
		if (EnableSoundAlerts) PlaySound(SoundFileName);
175
		LastAlertTime = time[rates_total - 1];
176
		LastAlertDirection = -1;
177
	}
178
}
179
   return(rates_total);
180
  }
181
//+------------------------------------------------------------------+