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

 

Gracias, el artículo es muy útil.

No me queda muy claro en el subtema "Limitar el número de lotes por un símbolo" el código de la función PositionVolume ( ) se da dos veces.
Justo debajo está la descripción de la función NewOrderAllowedVolume() y su llamada:

double orders_volume_on_symbol=PendingsVolume(symbol);

Sólo la descripción de la función PendingsVolume( ) no aparece en ninguna parte del artículo.

Si en lugar de la función PendingsVolume( ) se vuelve a dar por error la función PositionVolume(), por favor, corríjanlo.

 
ok google, como pasar la validacion, no no asi, necesito un ejemplo de un EA sencillo que pueda pasar la validacion al 100% para estudiar su codigo y compararlo con el mio para encontrar que puede ser un error, y mejor aun, mas detalles sobre la validacion - como ocurre, que hace.
 

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)
     {
      //--- 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 lógico. Si aún no hay posición, todavía hay que comprobar el volumen pendiente y calcular el volumen permitido. Este código devuelve allowed_volume=0 si no hay ninguna posición ya abierta sin tener en cuenta los pendings.

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);
      //--- comprueba 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.StopLoss(),orderinfo.TakeProfit());
     }
//--- llegó al final, no hay cambios para la orden
   return(false);       // no tiene sentido modificar 
  }

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

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

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

bool PositionModifyCheck(ulong ticket,double sl,double tp)

Error similar al del punto 2° anterior.

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

Gracias por solucionar estos errores, ten en cuenta que no he revisado todo el artículo en profundidad, así que quizás haya más.

 

Algunos otros comentarios sobre este artículo, pero no relacionados con errores en esta ocasión, sino más bien sobre mi opinión personal :

Access violation

Este error se produce al intentar acceder a una memoria cuyo acceso está denegado. En cada uno de estos casos, es necesario ponerse en contacto con los desarrolladores a través del Service Desk en su Perfil o a través de la página Contactos.
  • Curiosamente, esto no tiene nada que ver en un artículo sobre los errores de los usuarios (codificadores). Una violación de acceso significa que es un error en el código de Metaquotes

Este tipo de errores es relativamente raro, muchos de ellos tienen códigos listos, que están diseñados para ayudar en la búsqueda de la causa.

Constante Valor Descripción
ERR_ERROR_INTERNO 4001 Error interno inesperado
ERR_WRONG_INTERNAL_PARAMETER 4002 Parámetro incorrecto en la llamada interna de la función del terminal cliente
  • Los códigos de error están ahí para ayudar, pero "Error interno inesperado" es completamente inútil y "Parámetro incorrecto en la llamada interna de la función del terminal cliente" es realmente críptico (al menos para mí).

Se recomienda a los recién llegados a leer todos los artículos sobre la gestión de errores, así como hacer preguntas en el foro y en los comentarios del artículo. Otros miembros más experimentados de la comunidad MQL5.te ayudarán a resolver cualquier punto poco claro. Esperamos que la información recopilada en el artículo le ayude a crear robots comerciales más fiables y en menos tiempo.

  • Estoy totalmente en desacuerdo con dicha práctica, el Mercado es un servicio comercial propuesto por Metaquotes, ellos deberían asumir el soporte y no depender de la comunidad. Ese no es un enfoque profesional según mi punto de vista.

A pesar de las críticas, me gustaría agradecer a Metaquotes su gran trabajo en MT4/MT5, y animarles a seguir aumentando su nivel de calidad y profesionalidad.

 
Andrey Barinov:

Esta es la parte que plantea dudas:

¿Por qué se compara el margen exigido con el capital y no con el margen libre?

http://prntscr.com/dgd6s4

¿ahora qué pasa?

comprueba el margen, no hay suficiente dinero, no el comercio, pero no le permite aumentar el búho.

Снимка на екрана
Снимка на екрана
  • prnt.sc
Снимано с Lightshot
 
¡Por favor, dime cómo ser! Quiero sacar un producto - Asesor Experto Asistente, que debe estar obligado a abrir operaciones para que funcione. Sin vinculante no habrá oficios en el probador y no va a pasar la prueba
 
¿Lo has probado? ¿O era sólo un comentario de improviso?
 
Vladislav Andruschenko:
¿Lo probaste? ¿O sólo dijiste eso?
¡Lo hice! Apareció un mensaje de que no lo comprobó, ¡ningún búho abrió ninguna operación! Bueno, no lo hará si es un asistente.
 
Bogdan Bovykin:
Lo probé! Me salió un mensaje de que no estaba verificado, ¡no se abrió ni una sola operación! Bueno, no se abrirá si es un asistente.

Si es una utilidad, los moderadores comprueban el EA personalmente.

La utilidad se puede configurar para que el probador abra al menos un par de operaciones y le acompañe como asistente. No hay ningún problema.

 
Vladislav Andruschenko:

Si se trata de una utilidad, los moderadores comprueban el EA personalmente.

La utilidad se puede configurar para que el probador abra al menos un par de operaciones y les acompañe como asistente. Eso no es un problema.

Quiero decir, ¿quieres hacerlo como un panel? y comprobarlo de esa manera? o ¿qué?

Simplemente abre cualquier operación manualmente en el momento y adjunta este EA al gráfico a la entrada de la orden abierta.