EA basado en cruce de EMA's, abre operaciones contrarias a estretegia definida.

 

Buenas tardes, 

Tengo un problema con este EA, el cual  deberia activar ordenes de compra cuando la EMA5 esta por sobre la EMA21, y de venta si es al reves.

Sin embargo, me he dado cuenta que cuando a pesar de que la EMA5 esta por sobre la EMA21, aun asi se abren ordenes de venta algunas veces.

Ocurre lo mismo cuando la EMA5 esta por debajo de la EMA21, activandose ordenes de compra.

Desde ya muchas gracias!


//+------------------------------------------------------------------+
//|                                                  mar 23 iv.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
CTrade trade;

// Datos operacion

input double Lots = 0.01;
input int StopLoss = 300;
input int TakeProfit = 300;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
    double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);

    double EmaRapida = iMA(_Symbol, 0, 5, 0, MODE_EMA, PRICE_CLOSE);
    double EmaLenta =  iMA(_Symbol, 0, 21, 0, MODE_EMA, PRICE_CLOSE);

    double buffer = 0.010; // Adjust this buffer value as per your preference

    if(EmaRapida > EmaLenta && PositionsTotal() == 0) 
    {
        trade.Buy(Lots, _Symbol, Ask, (Ask - (StopLoss * _Point)), (Ask + (TakeProfit * _Point)), "Buy Operation");
    }

    if(EmaRapida < EmaLenta && PositionsTotal() == 0) 
    {
        trade.Sell(Lots, _Symbol, Bid, (Bid + (StopLoss * _Point)), (Bid - (TakeProfit * _Point)), "Sell Operation");
    }
}


//+------------------------------------------------------------------+
Archivos adjuntos:
 
cayenne:

Buenas tardes, 

Tengo un problema con este EA, el cual  deberia activar ordenes de compra cuando la EMA5 esta por sobre la EMA21, y de venta si es al reves.

Sin embargo, me he dado cuenta que cuando a pesar de que la EMA5 esta por sobre la EMA21, aun asi se abren ordenes de venta algunas veces.

Ocurre lo mismo cuando la EMA5 esta por debajo de la EMA21, activandose ordenes de compra.

Desde ya muchas gracias!


Hola. ¿este código lo has escrito tú? ¿Es este todo el código? Porque faltan bastantes cosas como inicializar los indicadores.

  MA_handle = iMA(NULL, PERIOD_CURRENT, 5, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_handle < 0)
     {
      Print("The creation of iMA has failed: MA_handle=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
   
   MA_handle2 = iMA(NULL, PERIOD_CURRENT, 21, 0, MODE_SMA, PRICE_CLOSE);
   if(MA_handle2 < 0)
     {
      Print("The creation of iMA has failed: MA_handle2=", INVALID_HANDLE);
      Print("Runtime error = ", GetLastError());
      return(INIT_FAILED);
     }
  if(CopyBuffer(MA_handle, 0, 0, 200, MA) <= 0) return;
   ArraySetAsSeries(MA, true);
   if(CopyBuffer(MA_handle2, 0, 0, 200, MA2) <= 0) return;
   ArraySetAsSeries(MA2, true);

Tampoco consigo saber en qué vela estás trabajando (creo que Metatrader tendrá el mismo problema, que tampoco lo sabe)

 //Open Buy Order, instant signal is tested first
   if(Cross(0, MA[0] > MA2[0]) //Moving Average 5 crosses above Moving Average 21
   )
//Otra alternativa para definir el cruce sería decir: Si la (MA[1] > MA2[1] && MA[0] < MA2[0]) entonces actúa

Además aquí no estás contemplando un cruce como tal, aunque podría servir, solo estás teniendo en cuenta que sea mayor o menor, no que se crucen.

Y por último, hay decenas de códigos publicados que puedes consultar como referencia en el Codebase. Consúltalos y si tienes más dudas, entonces vuelve aquí.

Buend día.

Razón de la queja: