testergraph

Nuestro segundo EA se basa en los famosos indicadores RSI y MACD. Se puede utilizar los cruces de MACD para determinar la tendencia alcista o bajista y los cruces por 50 del RSI como señales de entrada al mercado. En este Expert Advisor entraremos en las señales de compra del RSI cuando el filtro de la señal MACD nos indique que estamos en un mercado alcista, a la inversa para una señal de venta en un mercado bajista.

En la función start comprobaremos a cada vela la tendencia del mercado con la función determinaTendencia y las señales RSI con la función obtenerCruceRSI. Si la señal y el filtro coinciden operamos:

// Buscamos la tendencia y los cruces de RSI.
int tendenciaMACD = determinaTendencia();
int cruceRSI = obtenerCruceRSI();
 
// Operamos si coinciden tendencia y cruce de RSI.
if(tendenciaMACD == 0 && cruceRSI == 0)
         OrderSend(Symbol(),OP_BUY,Size,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MagicNumber,0,Green);
else if(tendenciaMACD == 1 && cruceRSI == 1)
         OrderSend(Symbol(),OP_SELL,Size,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,NULL,MagicNumber,0,Red);

El código de ambas funciones es símplemente una toma de datos mediante las funciones iRSI y iMACD de MQL4:

/* Obtiene los cruces por RSI
Devuelve: 0 cruce alcista, 1 cruce bajista, -1 sin cruce.
*/
int
obtenerCruceRSI()
{
   double valorOld = iRSI(0,0,PeriodRSI,PRICE_CLOSE,2);
   double valorNew = iRSI(0,0,PeriodRSI,PRICE_CLOSE,1);
 
   if(valorOld >= 50.0 && valorNew < 50.0) return(1); // Cruce BAJISTA.
   if(valorOld <= 50.0 && valorNew > 50.0) return(0); // Cruce ALCISTA.
 
   return(-1); // Sin cruce.
}
 
/* Determina la tendencia, la imprime en pantalla y la devuelve */
int
determinaTendencia()
{
   static int tendencia = -1; // Sin tendencia.
 
   // Tomar datos de las lineas RSI
   double grisMACD = iMACD(0,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,0,0);
   double rojoMACD = iMACD(0,0,FastEMA,SlowEMA,SignalSMA,PRICE_CLOSE,1,0);
 
   if(rojoMACD < grisMACD)
      tendencia = 0;
   if(rojoMACD > grisMACD)
      tendencia = 1;  
 
   return(tendencia);
}

A la hora de lanzar la operación hemos incluido algo especial: para determinar el StopLoss y el TakeProfit utilizaremos una función que dinámicamente nos de esos valores utilizando el indicador ATR (Average True Range). El código es:

// Determinamos SL y TP en función del ATR.
int ATR = iATR(Symbol(),0,14,1)/Point;
int StopLoss = ATR * 2;
int TakeProfit = ATR * 3;

Donde se ve que damos al StopLoss el doble de puntos que el valor del ATR y al TakeProfit el triple.

Lo único que nos queda por comentar son los parámetros del EA. Vale la pena hacer que todos los parámetros de los indicadores que utilice un Expert Advisor sean modificables al cargar el EA. Principalmente para poder optimizar el sistema y adaptarlo a cada par de divisas y tiempos de mercado.

extern string s1="*** Parámetros RSI ***";
extern int PeriodRSI = 9;
extern string s2="*** Parámetros MACD ***";
extern int FastEMA = 36;
extern int SlowEMA = 81;
extern int SignalSMA = 18;
extern string s3="*** Money Management ***";
extern double Size = 0.01;
extern int PeriodATR = 14;
int MagicNumber = 2342;

Eso es todo, un backtesting rápido nos dice que no está mal orientado, aunque falta optimizarlo.

El código para descargar: macdrsi.mq4