MQL4 Trend Indicator EA
The majority of trading systems use indicators to determine trading signals. Metatrader includes over 20 common indicators, including moving average, MACD, RSI, and stochastics. MQL has built in functions for the stock indicators. You can also use custom indicators in your expert advisor. Learn in this MQL4 Trend Indicator EA article how to program the Expert Advisor to trade using the most popular trend indicators.
Trend Indicators
The moving average is most well known of the trend indicators. It shows whether the price has moved up or down over the indicator period. We have seen how to contruct the conditions of a moving average crossover. Let us examine the conditions of other trend indicators for a strategy entry and exit.
If you go to your MT4 console and you click Insert / Indicators / Trend, you get the following list of indicators:
- Average Directional Index
- Bollinger Bands
- Commodity Channel Index
- Moving Average
- Parabolic Sar
- Standard Deviation
All of these can be converted into buy and sell conditions within your expert advisors, as you shall see below.
Params | Average Directional Index |
---|---|
Intent | //Buy: +DI line is above -DI line, ADX is more than a certain value and grows (i.e. trend strengthens) //Sell: -Dline is above +DI line, ADX is more than a certain value and grows (i.e. trend strengthens) |
Extern | extern int adx=0; //Indicator period extern int adu=14; //Period of averaging for index calculation extern double minadx=20; //Minimal threshold value of ADX |
Indicator Calling | PosDLine =iADX(NULL,adx,adu,PRICE_CLOSE,MODE_PLUSDI,0); NegDLine =iADX(NULL,adx,adu,PRICE_CLOSE,MODE_MINUSDI,0); ADXCurrent =iADX(NULL,adx,adu,PRICE_CLOSE,MODE_MAIN,0); ADXPrevious =iADX(NULL,adx,adu,PRICE_CLOSE,MODE_MAIN,1); |
BuyCond | if (PosDLine > NegDLine && ADXCurrent >= minadx && ADXCurrent > ADXPrevious) |
SellCond | if (NegDLine > PosDLine && ADXCurrent >= minadx && ADXCurrent > ADXPrevious) |
Params | Bollinger Band |
---|---|
Intent | //Buy: price crossed lower line upwards (returned to it from below) //Sell: price crossed upper line downwards (returned to it from above) |
Extern | extern int bandp=0; //Indicator period extern int bandpx=20; //Period of averaging for indicator calculation extern int banddev=2; //Deviation from the main line |
Indicator Calling | BBLowCurrent=iBands(NULL,bandp, bandpx, banddev,0,PRICE_CLOSE,MODE_LOWER,0); BBLowPrevious=iBands(NULL,bandp, bandpx, banddev,0,PRICE_CLOSE,MODE_LOWER,1); BBUpCurrent=iBands(NULL,bandp, bandpx, banddev,0,PRICE_CLOSE,MODE_UPPER,0); BBUpPrevious=iBands(NULL,bandp, bandpx, banddev,0,PRICE_CLOSE,MODE_UPPER,1); BBCurrentClose = iClose (NULL, 0,0); BBPreviousClose = iClose (NULL, 0,1); |
BuyCond | if (BBLowPrevious<BBPreviousClose && BBLowCurrent>=BBCurrentClose) |
SellCond | if (BBUpPrevious>BBPreviousClose && BBUpCurrent<=BBCurrentClose) |
Commodity Chanel Index | |
---|---|
Intent | //Buy: 1. indicator crosses +100 from below upwards. 2. Crossing -100 from below upwards. 3. //Sell: 1. indicator crosses -100 from above downwards. 2. Crossing +100 downwards. 3. |
Extern | extern int CCp=0; //Indicator period extern int CCpx=14; //Period of averaging for indicator calculation extern int CCLine = 100; |
Indicator Calling | CCCurrent = iCCI(NULL,CCp,CCpx,PRICE_TYPICAL,0); CCPrevious = iCCI(NULL,CCp,CCpx,PRICE_TYPICAL,1); CCCrossLinePos = CCLine; CCCrossLineNeg =-CCLine; |
BuyCond | if ((CCPrevious<CCCrossLinePos && CCCurrent >= CCCrossLinePos) || (CCPrevious <=CCCrossLineNeg&& CCCurrent>=CCCrossLineNeg) ) |
SellCond | if ((CCPrevious>CCCrossLinePos && CCCurrent <= CCCrossLinePos)|| (CCPrevious >=CCCrossLineNeg&& CCCurrent<=CCCrossLineNeg) ) |
Parabolic Sar | |
---|---|
Note | //Buy: Parabolic SAR crosses price downwards //Sell: Parabolic SAR crosses price upwards |
Extern | extern int sar=0; //Indicator period extern double sarstep=0.02; //Stop level increment extern double sarstop=0.2; //Maximal stop level extern int sar2=0; //Price period |
Indicator Calling | sarcurrent = iSAR(NULL,sar,sarstep,sarstop,0); sarprevious = iSAR(NULL,sar,sarstep,sarstop,1); closecurrent = iClose(NULL,0,0); closeprevious = iClose(NULL,0,1); |
BuyCond | if (sarprevious>closeprevious&&sarcurrent<=closecurrent) |
SellCond | if (sarprevious<closeprevious&&sarcurrent>=closecurrent) |
MA Rising or Falling | |
---|---|
Intent | //Buy: MA grows //Sell: MA falls |
Extern | extern int maperiod=14; //Period of averaging for indicator calculation extern int mamode = 1; // Type of moving average, 1= Exponential |
Indicator Calling | macurrent = iMA(NULL,0,maperiod,0,mamode,0); maprevious = iMA(NULL,0,maperiod,0,mamode,1); maprevious2 =iMA(NULL,0,maperiod,0,mamode,2); |
BuyCond | if(maprevious2 > maprevious && maprevious > macurrent) |
SellCond | if (maprevious2 < maprevious && maprevious < macurrent) |