//+------------------------------------------------------------------+ //| MACDRSI.mq4 | //| Programando Forex | //| http://www.programandoforex.com | //+------------------------------------------------------------------+ #property copyright "Programando Forex" #property link "http://www.programandoforex.com" // DEBUG #include bool DEBUG = true; 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; // DEBUG void BreakPoint(bool Condicion = true) { if(DEBUG) { if(!IsVisualMode() || !Condicion) return(0); keybd_event(19,0,0,0); Sleep(100); keybd_event(19,0,2,0); } } int start() { static datetime MarcaTiempo = 0; datetime NuevaTiempo = Time[0]; /* CADA CIERRE VELA *********************************************/ if(MarcaTiempo != NuevaTiempo) { // 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; // 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); BreakPoint(); } else if(tendenciaMACD == 1 && cruceRSI == 1) { OrderSend(Symbol(),OP_SELL,Size,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,NULL,MagicNumber,0,Red); BreakPoint(); } MarcaTiempo = NuevaTiempo; } /* CADA CIERRE VELA *********************************************/ return(0); } /* 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); }