Discusión sobre el artículo "Guía paso a paso para escribir un Expert Advisor en MQL5 para principiantes" - página 22

 
Buen día, Si alguien me pudiera ayudar por favor. A mi entender, hice todo lo que se indica en el articulo. Pero no logro poder tener dos operaciones simultaneas abiertas, mas allá de lo que entiendo que el autor quiso hacer de no colocar compra si ya había compra o venta si ya había venta. Mi estrategia, manda por ejemplo señal de venta cuando tengo una orden abierta de compra, y en lugar de abrir una venta, el codigo me cierra la operación de compra sin que esta pueda tocar el tp/sl. Y asi me quedo sin venta ni compra. La venta cierra compra y compra cierra venta. Estoy usando en mi estrategia solo un par, solo una temporalidad y solo un tamaño de lote. Me podrían decir como puedo tener compra y venta abiertas al mismo tiempo si así lo llega a activar la estrategia? Es decir, que las ordenes ÚNICAMENTE se cierren mediante tp/sl. De antemano, muchas gracias.
 
Gran artículo.
 
Sella170:
¿Alguien sabe si puedo usar este EA para mini-index o mini-dólares?
Sí, puede utilizar el EA arrastrando el ratón al gráfico o menú > insertar > Asesor experto > {nomedoseurobo}.

Espero que su pregunta haya sido respondida.

 
Muchas gracias por el excelente artículo. Dónde y cómo se implementaría el módulo de filtro de tiempo intradía en su código?
 

Hola chicos, buenos días.

Estoy en el"Probador de Estrategias" con este archivo del final de la Guía y me muestra el siguiente error:

*el error ya ha sido comentado aquí en este artículo, pero ninguna solución escrita me ha funcionado y necesito vuestra ayuda.


OF      0       12:44:39.040    EA_ADX (XAUUSD,H1)      2020.01.03 19:00:00   Alert: The Buy order request could not be completed -error:4756
ED      2       12:44:39.043    Trades  2020.01.03 20:00:00   failed market buy 0.1 XAUUSD sl: 1549.09 tp: 1549.16 [Invalid stops]
JP      0       12:44:39.043    EA_ADX (XAUUSD,H1)      2020.01.03 20:00:00   Alert: The Buy order request could not be completed -error:4756
ER      2       12:44:39.049    Trades  2020.01.03 21:00:00   failed market buy 0.1 XAUUSD sl: 1549.90 tp: 1549.97 [Invalid stops]
MR      0       12:44:39.049    EA_ADX (XAUUSD,H1)      2020.01.03 21:00:00   Alert: The Buy order request could not be completed -error:4756
PP      2       12:44:39.053    Trades  2020.01.03 22:00:00   failed market buy 0.1 XAUUSD sl: 1548.16 tp: 1548.23 [Invalid stops]


El archivo está al final de la Guía.

¿Cómo puedo solucionar este problema?

 
surfdoode2:


Yo también sigo teniendo este error después de haber hecho las dos correcciones sugeridas:

ZeroMemory(mrequest);

y también

if(Compra_abierta || Venta_abierta)

¿Puede alguien ayudarme con el error 4756? Parece que no se puede colocar una orden de compra.

Compruebe si utilizó la función SymbolInfoTick y escribió esta parte del código:

//--- Obtener la última cotización utilizando la estructura MQL5 MqlTick
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");
      return;
     }
Documentation on MQL5: Market Info / SymbolInfoTick
Documentation on MQL5: Market Info / SymbolInfoTick
  • www.mql5.com
SymbolInfoTick - Market Info - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Aquí hay un error en la lógica del algoritmo:
 //--- ¿Tenemos ya puestos abiertos?
     bool Buy_opened= false ;   // variable para guardar el resultado de Comprar posición abierta
     bool Sell_opened= false ; // variable para contener el resultado de Vender posición abierta
    
     if ( PositionSelect ( _Symbol ) == true )   // tenemos una posición abierta
    {
         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ;   //Es una Compra
         }
         else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Es una Venta
         }
    }

Dado que PositionSelect selecciona la primera posición para _Symbol, si el EA abre una posición de compra, la variable Sell_opened siempre será falsa mientras la posición de compra esté abierta, provocando que se realicen múltiples posiciones de venta cada vez que haya una señal de venta.

Para corregir esto y saber si hay posiciones de compra y venta abiertas simultáneamente, se puede utilizar la siguiente lógica:

 //--- ¿Tenemos ya puestos abiertos?
   bool Buy_opened = false ;   // variable para guardar el resultado de Comprar posición abierta
   bool Sell_opened = false ; // variables para contener el resultado de Vender posición abierta

   if ( PositionSelect ( _Symbol ) == true ) // tenemos una posición abierta
   {
       for ( int i= 0 ;i< PositionsTotal ();i++){
	 
         PositionSelectByTicket ( PositionGetTicket (i));

         if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_SELL )
         {
            Sell_opened = true ; // Es una Venta
         } else if ( PositionGetInteger ( POSITION_TYPE ) == POSITION_TYPE_BUY )
         {
            Buy_opened = true ; //Es una Compra
         }
      }
   
Documentação sobre MQL5: Funções de Negociação / PositionSelect
Documentação sobre MQL5: Funções de Negociação / PositionSelect
  • www.mql5.com
PositionSelect - Funções de Negociação - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Vitor Gama Barreto:

Hola a todos, buenos días.

Estoy en el"Probador de Estrategias" con este archivo del final de la Guía y muestra el siguiente error:

*el error ya ha sido comentado aquí en este artículo, pero ninguna solución escrita me ha funcionado y necesito vuestra ayuda.



El archivo está al final de la Guía.

¿Cómo puedo solucionar este problema?

Comprueba el precio de venta que estás solicitando, para ello utiliza breakpoint para depurar las variables mrequest.price, mrequest.sl y mrequest.tp.

Pruebe a cambiar

mrequest.type_filling = ORDER_FILLING_FOK;                               // Tipo de ejecución de la orden

a:

mrequest.type_filling = ORDER_FILLING_IOC;                               // Tipo de ejecución de la orden


Algunos papeles tienen reglas mínimas de stop loss, lea más aquí: https://www.mql5.com/pt/forum/319474

ERRO 4756 - INVALID PRICE
ERRO 4756 - INVALID PRICE
  • 2019.08.06
  • www.mql5.com
Ja tentei de tudo, por favor, preciso muito da ajuda de voces!! alguem pode me dar uma luz??? E retorna o : 2019.08.05 13:42:51.236 Core 1 2019.08...
 

Hola, 

Muchas gracias por el artículo Samuel. ¡Eres un crack!

Me ha costado un poco que me funcionase con mi broker porque el artículo es en versión en modo "net" y he tenido que buscar información para ponerlo en modo "hedging". El primer problema que me encontré es con el mrequest.type_filling. 

Para el broker XM, el que funciona es: 

mrequest.type_filling = ORDER_FILLING_IOC;                                          // Tipo de ejecución de la orden

Si no sabes cual es la que permite tu MT5, mi recomendación es que uses la función TypeFilling() en un Print(TypeFilling()) o un Comment( TypeFilling()) y este devuelve el tipo; si te dice que es 1 (ORDER_FILLING_FOK) o 2 (ORDER_FILLING_IOC) ya sabes cual tienes que poner (https://www.mql5.com/es/docs/constants/tradingconstants/orderproperties#enum_order_type_filling) ya que a mi el  ORDER_FILLING_FOK (1) no me funciona con este broker. 


Una vez arreglado eso, el problema es que con el PositionSelect abre muchísimas posiciones. Aunque no lo dice Samuel en su estrategia, entiendo que el objetivo es abrir una única posición buy o sell (la que primero se de) con el criterio establecido (los 4 pasos booleanos) y que hasta que no se cierre esta posición, no podemos abrir otra. 

Yo lo que he hecho es cambiar este código ...

//--- no tenemos errores, así que continuamos
//--- ¿Tenemos posiciones abiertas ya?
    bool Buy_opened=false;  // variable que almacena el resultado de la posición abierta Compra
    bool Sell_opened=false; // variable que almacena el resultado de la posición abierta Venta
    
    if (PositionSelect(_Symbol) ==true)  // tenemos una posición abierta
    {
         if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
            Buy_opened = true;  // Es una Compra
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
            Sell_opened = true; // Es una Venta
         }
    }

Por este... 

//--- No tenemos errores así que continuamos
//--- ¿Tenemos posiciones abiertas ya?
   bool Buy_opened = false;               // Variable que almacena el resultado de la posición abierta de Compra
   bool Sell_opened = false;              // Variable que almacena el resultado de la posición abierta de Venta
   
   // Vamos a recorrer todas las órdenes para ver si hay alguna abierta
   for(int i = 0; i < PositionsTotal(); i++)   
        {
         ulong ticket = PositionGetTicket(i);
         PositionSelectByTicket(ticket);
    
    if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          Buy_opened = true;       // es una compra
         }
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          Sell_opened = true;      // es una venta
         }
   }

// si hay una posición abierta esperamos hasta que la operación activa se cierre (que toque el SL o elTP)
   if (Buy_opened || Sell_opened) return; 

Nota: Justo después viene la linea...

//--- Copiar el precio de cierre de la barra anterior a la barra actual, que es la barra1
   p_close=mrate[1].close;

De esta forma me ha funcionado bien. Espero que os sirva. 

Un saludo. 

 
surfdoode2:


Yo también sigo teniendo este error después de haber hecho las dos correcciones sugeridas:

ZeroMemory(mrequest);

y también

if(Compra_abierta || Venta_abierta)

¿Puede alguien ayudarme con el error 4756? Parece que no se puede colocar una orden de compra.


Tal vez el tipo de llenado de su corredor es ORDER_FILLING_IOC, usted puede tratar de editar el código de:

mrequest.type_filling = ORDER_FILLING_FOK;

A:

mrequest.type_filling = ORDER_FILLING_IOC;

Yo tenía el mismo problema y ahora lo he resuelto con éxito