Mi EA devuelve un error al registrar un nuevo producto:
test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modificación fallida debido a que la orden o posición está cerca del mercado].
Pero mi EA está pensado para funcionar en WIN$, no en forex. ¿Por qué el probador no le permite saber qué activo ejecutar?
Ahora cómo puedo corregir algo que no tiene ningún error, porque el EA está funcionando perfectamente, sólo que no puedo registrar el producto para la venta.
Mi EA devuelve un error al registrar un nuevo producto:
test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modificación fallida debido a que la orden o posición está cerca del mercado].
Pero mi EA está pensado para funcionar en WIN$, no en forex. ¿Por qué el probador no le permite saber qué activo ejecutar?
Ahora cómo puedo corregir algo que no tiene ningún error, porque el EA está funcionando perfectamente, sólo que no puedo registrar el producto para la venta.
El robot debe estar preparado para trabajar en cualquier activo....
Para corregir el error mencionado anteriormente, debe realizar la siguiente comprobación antes de modificar la posición:
//+--------------------------------------------------------------------------------------------------------------------+//| Comprueba si la distancia entre el TakeProfit/StopLoss y el precio de cierre es mayor que SYMBOL_TRADE_STOPS_LEVEL ||//+--------------------------------------------------------------------------------------------------------------------+bool Check_SL_TP(ENUM_ORDER_TYPE type, double SL, double TP)
{
//--- Variables localesbool SL_check = false, TP_check = false;
//--- Determina el último precio del símbolo actualdouble BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
//--- obtener el nivel SYMBOL_TRADE_STOPS_LEVELint stops_level = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
if(stops_level != 0)
{
PrintFormat("SYMBOL_TRADE_STOPS_LEVEL=%d: StopLoss and TakeProfit must not be nearer than %d points from the closing price", stops_level, stops_level);
}
//--- comprobar sólo dos tipos de ordenswitch(type)
{
//--- Operación de compracaseORDER_TYPE_BUY:
{
//--- comprueba el StopLoss
SL_check = (BID - SL > stops_level * _Point);
if(!SL_check)
{
ERRMSG = StringFormat("For order %s StopLoss=%.5f must be less than %.5f (Bid=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, BID - stops_level * _Point, BID, stops_level);
}
//--- comprobar el TakeProfit
TP_check = (TP - BID > stops_level * _Point);
if(!TP_check)
{
ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be greater than %.5f (Bid=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, BID + stops_level * _Point, BID, stops_level);
}
//--- devuelve el resultado de la comprobaciónreturn(SL_check && TP_check);
}
//--- Operación de ventacaseORDER_TYPE_SELL:
{
//--- comprueba el StopLoss
SL_check = (SL - ASK > stops_level * _Point);
if(!SL_check)
{
ERRMSG = StringFormat("For order %s StopLoss=%.5f must be greater than %.5f (Ask=%.5f + SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), SL, ASK + stops_level * _Point, ASK, stops_level);
}
//--- comprobar el TakeProfit
TP_check = (ASK - TP > stops_level * _Point);
if(!TP_check)
{
ERRMSG = StringFormat("For order %s TakeProfit=%.5f must be less than %.5f (Ask=%.5f - SYMBOL_TRADE_STOPS_LEVEL=%d points)", EnumToString(type), TP, ASK - stops_level * _Point, ASK, stops_level);
}
//--- devuelve el resultado de la comprobaciónreturn(TP_check && SL_check);
}
break;
}
//--- Verificación exitosareturn(false);
}
Ver otras comprobaciones que debe realizar el robot en el siguiente artículo:
Hola, no puedo editar la descripción de uno de mis antiguos productos.
He seguido las instrucciones de los distintos foros, incluyendo escribir la descripción de nuevo, ocultarla del mercado, etc., pero la descripción sigue volviendo a la versión original.
Ahora ya no puedo restaurar el producto en el mercado ni puedo editarlo. He solicitado ayuda en los foros en relación con este problema, pero aún no he recibido ayuda.
¿Cómo puedo resolver este problema de "No poder editar la descripción del producto"? Por favor, ayuda
Volúmenes incorrectos en las operaciones comerciales
Antes de enviar las órdenes comerciales, también es necesario comprobar si los volúmenes especificados en la orden son correctos. Antes de llamar a la función OrderSend() se debe comprobar el número de lotes que el Asesor Experto va a especificar en la orden. Para los instrumentos financieros, laEspecificación especifica los volúmenes mínimos y máximos permitidos para la negociación, así como la gradación del volumen. Puedes obtener estos valores en MQL5desde la enumeración ENUM_SYMBOL_INFO_DOUBLE usando la funciónSymbolInfoDouble().
//+------------------------------------------------------------------+//| Comprueba que el volumen de pedidos sea correcto |||//+------------------------------------------------------------------+bool CheckVolumeValue(double volume,string &description)
{
//--- volumen mínimo admisible para operaciones comercialesdouble min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(volume<min_volume)
{
description=StringFormat("Volumen inferior al mínimo permitido SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(false);
}
//--- volumen máximo admisible para operaciones comercialesdouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(volume>max_volume)
{
description=StringFormat("Volumen superior al máximo permitido SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(false);
}
//--- obtener la gradación mínima de volumendouble volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("El volumen no es múltiplo de la graduación mínima SYMBOL_VOLUME_STEP=%.2f, el volumen correcto más próximo es %.2f",
volume_step,ratio*volume_step);
return(false);
}
description="Valor de volumen correcto";
return(true);
}
Volúmenes incorrectos en las operaciones comerciales
Antes de enviar las órdenes comerciales, también es necesario comprobar si los volúmenes especificados en la orden son correctos. Antes de llamar a la función OrderSend() se debe comprobar el número de lotes que el Asesor Experto va a especificar en la orden. Para los instrumentos financieros, laEspecificación especifica los volúmenes mínimos y máximos permitidos para la negociación, así como la gradación del volumen. Estos valores se pueden obtener en MQL5a partir de la enumeración ENUM_SYMBOL_INFO_DOUBLE utilizando la funciónSymbolInfoDouble()
No ayudó, ¿puedo arreglar algún otro código?
¿Puede decirme cómo perfeccionar el script?
Lea el artículo completamente, 'CheckVolumeValue' es una comprobación de la corrección de los parámetros de entrada.
Y también hay una comprobación del correcto redondeo del lote ...
Teniendo en cuenta el volumen de la posición abierta y el volumen en órdenes pendientes, la comprobación final tendría este aspecto:
//+------------------------------------------------------------------+//| Devuelve el volumen máximo permitido para la orden por símbolo ||//+------------------------------------------------------------------+double NewOrderAllowedVolume(string symbol)
{
double allowed_volume=0;
//--- obtener el límite máximo de volumen en la ordendouble symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obtener el límite de caracteres en el volumendouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);
//--- obtener el volumen de la posición abierta por símbolodouble opened_volume=PositionVolume(symbol);
if(opened_volume>=0)
{
//--- si ya 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);
}
//+------------------------------------------------------------------+//| Función de inicio del programa de script|//+------------------------------------------------------------------+voidOnStart()
{
//---double step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP)/2.0;
double volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN)-step;
double finish=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX)+step;
//--- averigua cuántos decimales contiene la gradación de volumenint digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
if(digits<0) digits=-digits;
else digits=0;
//--- comprobar muchos valores de volumen diferentes en el buclewhile(volume<finish+4*step)
{
string descr;
if(!CheckVolumeValue(volume,descr))
{
Print("Resultado de la inspección ",volume,": ",descr);
}
elsePrintFormat("El volumen %G es correcto".,volume);
volume+=3*step;
volume=NormalizeDouble(volume,digits+1);
}
//---
}
//+------------------------------------------------------------------+//| Comprueba que el volumen de pedidos sea correcto |||//+------------------------------------------------------------------+bool CheckVolumeValue(double volume,string &description)
{
//--- volumen mínimo admisible para operaciones comercialesdouble min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
if(volume<min_volume)
{
description=StringFormat("Volumen inferior al mínimo permitido SYMBOL_VOLUME_MIN=%.2f",min_volume);
return(false);
}
//--- volumen máximo admisible para operaciones comercialesdouble max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
if(volume>max_volume)
{
description=StringFormat("Volumen superior al máximo permitido SYMBOL_VOLUME_MAX=%.2f",max_volume);
return(false);
}
//--- obtener la gradación mínima de volumendouble volume_step=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP);
int ratio=(int)MathRound(volume/volume_step);
if(MathAbs(ratio*volume_step-volume)>0.0000001)
{
description=StringFormat("El volumen no es múltiplo de la graduación mínima SYMBOL_VOLUME_STEP=%.2f, el volumen correcto más próximo es %.2f",
volume_step,ratio*volume_step);
return(false);
}
description="Valor de volumen correcto";
return(true);
}
//+------------------------------------------------------------------+
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
Mi EA devuelve un error al registrar un nuevo producto:
test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modificación fallida debido a que la orden o posición está cerca del mercado].
Pero mi EA está pensado para funcionar en WIN$, no en forex. ¿Por qué el probador no le permite saber qué activo ejecutar?
Ahora cómo puedo corregir algo que no tiene ningún error, porque el EA está funcionando perfectamente, sólo que no puedo registrar el producto para la venta.
Mi EA devuelve un error al registrar un nuevo producto:
test on EURUSD,H1 (netting) 2020.04.15 15:47:05 failed modify #44 sell 0.2 EURUSD sl: 1.08929, tp: 1.08599 -> sl: 1.08919, tp: 1.08599 [Modificación fallida debido a que la orden o posición está cerca del mercado].
Pero mi EA está pensado para funcionar en WIN$, no en forex. ¿Por qué el probador no le permite saber qué activo ejecutar?
Ahora cómo puedo corregir algo que no tiene ningún error, porque el EA está funcionando perfectamente, sólo que no puedo registrar el producto para la venta.
El robot debe estar preparado para trabajar en cualquier activo....
Para corregir el error mencionado anteriormente, debe realizar la siguiente comprobación antes de modificar la posición:
Ver otras comprobaciones que debe realizar el robot en el siguiente artículo:
Qué pruebas debe pasar un robot de trading antes de ser publicado en el Mercado - Artículos MQL5
Hola, no puedo editar la descripción de uno de mis antiguos productos.
He seguido las instrucciones de los distintos foros, incluyendo escribir la descripción de nuevo, ocultarla del mercado, etc., pero la descripción sigue volviendo a la versión original.
Ahora ya no puedo restaurar el producto en el mercado ni puedo editarlo. He solicitado ayuda en los foros en relación con este problema, pero aún no he recibido ayuda.
¿Cómo puedo resolver este problema de "No poder editar la descripción del producto"? Por favor, ayuda
Al cargar el Asesor Experto y hacer pruebas escribe un error, no entiendo como corregirlo.
prueba en EURUSD,H1 (compensación)
2020.04.14 00:24:42 fallida compra instantánea 0.01 EURUSD a 1.09044 [Volumen no válido].
2020.04.14 00:24:45 fallida compra instantánea 0.01 EURUSD a 1.09044 [Volumen no válido].
2020.04.14 00:24:48 fallido compra instantánea 0,01 EURUSD a 1,09037 [volumen no válido].
2020.04.21 00:01:34 fallida compra instantánea 0.01 EURUSD a 1.08626 [Volumen no válido].
2020.04.21 00:01:37 fallido compra instantánea 0.01 EURUSD a 1.08626 [Volumen no válido].
2020.04.21 00:01:40 fallido compra instantánea 0,01 EURUSD a 1,08626 [volumen no válido].
2020.04.27 16:08:24 fallido venta instantánea 0,01 EURUSD a 1,08546 [volumen no válido].
2020.04.27 16:08:27 fallido venta instantánea 0.01 EURUSD a 1.08548 [Volumen no válido].
2020.04.27 16:08:30 fallido venta instantánea 0,01 EURUSD a 1,08547 [Volumen no válido].
2020.04.29 20:15:52 fallido venta inmediata 0.01 EURUSD a 1.08565 [Volumen no válido].
2020.04.29 20:15:55 fallido venta instantánea 0.01 EURUSD a 1.08566 [Volumen no válido].
2020.04.29 20:15:58 fallido venta instantánea 0.01 EURUSD a 1.08566 [Volumen no válido].
2020.05.18 00:12:09 fallida compra instantánea 0.01 EURUSD a 1.08134 [Volumen no válido].
2020.05.18 00:12:12 fallido compra instantánea 0.01 EURUSD a 1.08134 [Volumen no válido].
2020.05.18 00:12:15 fallida compra instantánea 0.01 EURUSD a 1.08143 [Volumen no válido].
2020.05.21 15:50:25 fallida venta instantánea 0.01 EURUSD a 1.10031 [Volumen no válido].
2020.05.21 15:50:28 fallido venta instantánea 0,01 EURUSD a 1,10034 [volumen no válido].
2020.05.21 15:50:31 fallido venta inmediata 0.01 EURUSD a 1.10036 [Volumen no válido].
2020.05.25 19:00:05 failed instant buy 0.01 EURUSD at 1.08950 [Invalid volume] [Volumen no válido
2020.05.25 19:00:08 fallido compra instantánea 0,01 EURUSD a 1,08951 [volumen no válido].
2020.05.25 19:00:11 fallida compra instantánea 0.01 EURUSD a 1.08952 [Volumen no válido].
no hay operaciones
Al cargar el Asesor Experto y probarlo escribe un error, no está claro cómo corregirlo.
prueba en EURUSD,H1 (compensación)
2020.04.14 00:24:42 falló la compra instantánea 0.01 EURUSD a 1.09044 [Volumen no válido].
***
Léalo, introdúzcalo en el código
Volúmenes incorrectos en las operaciones comerciales
Antes de enviar las órdenes comerciales, también es necesario comprobar si los volúmenes especificados en la orden son correctos. Antes de llamar a la función OrderSend() se debe comprobar el número de lotes que el Asesor Experto va a especificar en la orden. Para los instrumentos financieros, laEspecificación especifica los volúmenes mínimos y máximos permitidos para la negociación, así como la gradación del volumen. Puedes obtener estos valores en MQL5desde la enumeración ENUM_SYMBOL_INFO_DOUBLE usando la funciónSymbolInfoDouble().
No ayudó, ¿puedo arreglar otro código?
¿Puede decirme cómo perfeccionar el script?
Léelo, ponlo en el código
Volúmenes incorrectos en las operaciones comerciales
Antes de enviar las órdenes comerciales, también es necesario comprobar si los volúmenes especificados en la orden son correctos. Antes de llamar a la función OrderSend() se debe comprobar el número de lotes que el Asesor Experto va a especificar en la orden. Para los instrumentos financieros, laEspecificación especifica los volúmenes mínimos y máximos permitidos para la negociación, así como la gradación del volumen. Estos valores se pueden obtener en MQL5a partir de la enumeración ENUM_SYMBOL_INFO_DOUBLE utilizando la funciónSymbolInfoDouble()
No ayudó, ¿puedo arreglar algún otro código?
¿Puede decirme cómo perfeccionar el script?
Lea el artículo completamente, 'CheckVolumeValue' es una comprobación de la corrección de los parámetros de entrada.
Y también hay una comprobación del correcto redondeo del lote ...
Teniendo en cuenta el volumen de la posición abierta y el volumen en órdenes pendientes, la comprobación final tendría este aspecto:
add?
checkvolumevalue.mq5 como está escrito aquí
¿Añadir?
checkvolumevalue.mq5 como está escrito aquí
Todas las comprobaciones necesarias están en el artículo Casi un constructor para crear un EA
¿Es adecuado el código sobre el que se ha preguntado antes?
Podrías escribir las líneas necesarias a partir del artículo.