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:
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.
1°
//+------------------------------------------------------------------+//| 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 ordendouble symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obtener la limitación del volumen por un símbolodouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);
//--- obtener el volumen de la posición abierta por un símbolodouble opened_volume=PositionVolume(symbol);
if(opened_volume>=0)
{
//--- si hemos agotado el volumenif(max_volume-opened_volume<=0)
return(0);
//--- el volumen de la posición abierta no supera max_volumedouble 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.
2°
bool OrderModifyCheck(ulong ticket,double price,double sl,double tp)
{
//--- seleccionar orden por ticketif(orderinfo.Select(ticket))
{
//--- tamaño del punto y nombre del símbolo, para el que se colocó una orden pendientestring symbol=orderinfo.Symbol();
double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
//--- comprobar si hay cambios en el precio de aperturabool PriceOpenChanged=(MathAbs(orderinfo.PriceOpen()-price)>point);
//--- comprobar si hay cambios en el nivel de StopLossbool StopLossChanged=(MathAbs(orderinfo.StopLoss()-sl)>point);
//--- comprueba si hay cambios en el nivel de Takeprofitbool TakeProfitChanged=(MathAbs(orderinfo.TakeProfit()-sl)>tp);
//--- si hay cambios en los nivelesif(PriceOpenChanged || StopLossChanged || TakeProfitChanged)
return(true); // el orden puede modificarse //--- no hay cambios en los niveles Open, StopLoss y Takeprofitelse//--- notificar sobre el errorPrintFormat("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 ordenreturn(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).
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.
¡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
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.
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.
1°
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.
2°
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).
3°
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.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.
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.
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.
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.
¿Lo probaste? ¿O sólo dijiste eso?
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.
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.