Discusión sobre el artículo "Qué comprobaciones debe superar un robot comercial antes de ser publicado en el Mercado" - página 3

 
Bogdan Bovykin:

me refiero a hacerlo como un panel? y comprobarlo de esa manera? o como?

solo abro cualquier operación manualmente por el momento y este EA se adjunta al gráfico a la entrada de la orden abierta.

ok

Si TÚ mismo has escrito la utilidad, puedes abrir una operación en el probador en INIT y el asistente la gestionará.

 

Si el Asesor Experto ha pasado las pruebas en el terminal y abre operaciones, luego en la comprobación automática escribe un error que no se han abierto operaciones (par y TF son iguales), respectivamente no pasa la "Comprobación automática"

¿Coincidencia? No lo creo.

¿Que hacer?

 
Tuve el mismo error recientemente, sólo tuve que forzar la apertura de un comercio en inite
 

¿Es posible que MetaQuotes genere una plantilla para los desarrolladores? Facilitaría las cosas a los desarrolladores y también ahorraría a MetaQuotes toneladas de dinero y recursos en la comprobación de los EAs enviados.

Tener la plantilla para el desarrollador en la base de código

https://www.mql5.com/es/code/mt4/experts/best

 
Alain Verleyen:

Es un artículo interesante, desgraciadamente hay demasiados errores (errores tipográficos o incluso errores lógicos en el código propuesto), y probablemente confundirá más a la gente que ayudarles en algunos puntos.

//+------------------------------------------------------------------+
//| Devuelve el volumen máximo permitido para una orden sobre el símbolo ||
//+------------------------------------------------------------------+
double NewOrderAllowedVolume(string symbol)
  {
   double allowed_volume=0;
//--- obtener la limitación del volumen máximo de una orden
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obtener la limitación del volumen por un símbolo
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- obtener el volumen de la posición abierta por un símbolo
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)  There is no opened positions
     {
      //--- si hemos agotado el volumen
      if(max_volume-opened_volume<=0)
         return(0);

      //--- el volumen de la posición abierta no supera max_volume
      double orders_volume_on_symbol=PendingsVolume(symbol);
      allowed_volume=max_volume-opened_volume-orders_volume_on_symbol;
      if(allowed_volume>symbol_max_volume) allowed_volume=symbol_max_volume;
     }
   return(allowed_volume);
  }

Error logico. Si todavía no hay posición, hay que comprobar el volumen pendiente y calcular el volumen permitido. Este codigo devuelve allowed_volume=0 si no hay ninguna posicion ya abierta sin tener en cuenta los pendings.

En este código también comprobamos el volumen de las órdenes pendientes.
 
Alain Verleyen:


+ parámetro que falta (PrintFormat tiene para %, pero sólo se proporcionan 3 parámetros).

Gracias. Fijo

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- seleccionar orden por ticket
   if(orderinfo.Select(ticket))
     {
      //--- tamaño del punto y nombre del símbolo, para el que se colocó una orden pendiente
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- comprobar si hay cambios en el precio de apertura
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- comprobar si hay cambios en el nivel de StopLoss
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- comprobar si hay cambios en el nivel de Takeprofit
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- si hay cambios en los niveles
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
         return(true);  // el orden puede modificarse 
      //--- no hay cambios en los niveles Open, StopLoss y Takeprofit
      else
      //--- notificar sobre el error
         PrintFormat("Order #%d already has levels of Open=%.5f SL=%.5f TP=%.5f",
                     ticket,orderinfo.PriceOpen(),orderinfo.StopLoss(),orderinfo.TakeProfit());
     }
//--- llegó al final, no hay cambios para la orden
   return(false);       // no tiene sentido modificar 
  }
 
Alain Verleyen:

Error similar al del punto 2° anterior.

Y los mismos errores también en OrderModifyCheck() versión mql4.


Todo arreglado, ¡gracias!

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- seleccionar orden por ticket
   if(orderinfo.Select(ticket))
     {
      //--- tamaño del punto y nombre del símbolo, para el que se colocó una orden pendiente
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- comprobar si hay cambios en el precio de apertura
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- comprobar si hay cambios en el nivel de StopLoss
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);

Otro error lógico. Cambiar un SL/TP en 1 punto está permitido. Debería ser >=

Por lo que recuerdo, utilizamos esta práctica sólo con el fin de no obtener la denegación de comercio sercver debido a que el precio cambia por el momento, mientras que nuestra solicitud de comercio llega al servidor.

Es un enfoque más seguro.

 
Alain Verleyen:

bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
  {
//--- seleccionar orden por ticket
   if(orderinfo.Select(ticket))
     {
      //--- tamaño del punto y nombre del símbolo, para el que se colocó una orden pendiente
      string symbol=orderinfo.Symbol();
      double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      //--- comprobar si hay cambios en el precio de apertura
      bool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
      //--- comprobar si hay cambios en el nivel de StopLoss
      bool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
      //--- comprobar si hay cambios en el nivel de Takeprofit
      bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
      //--- si hay cambios en los niveles
      if(PriceOpenChanged || StopLossChanged || TakeProfitChanged)

+ error tipográfico, debería ser "-tp)>=punto);"

Gracias
 
bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);

//--

bool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-tp)>point);