Discusión sobre el artículo "Cómo publicar un producto en el Mercado" - página 48

 

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.

 
Adriano De Mello Moura #:

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 locales
   bool SL_check = false, TP_check = false;

//--- Determina el último precio del símbolo actual
   double BID = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double ASK = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

//--- obtener el nivel SYMBOL_TRADE_STOPS_LEVEL
   int 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 orden
   switch(type)
     {
      //--- Operación de compra
      case  ORDER_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ón
         return(SL_check && TP_check);
        }
      //--- Operación de venta
      case  ORDER_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ón
         return(TP_check && SL_check);
        }
      break;
     }

//--- Verificación exitosa
   return(false);
  }



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

 
Kirill Voytseshchuk #:

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].

***

Por favor, lea el mensaje de error completo - habrá un enlace al artículo, "Lo que los controles deben pasar ...".
 

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().

//+------------------------------------------------------------------+
//| Comprueba que el volumen de pedidos sea correcto |||
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &description)
  {
//--- volumen mínimo admisible para operaciones comerciales
   double 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 comerciales
   double 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 volumen
   double 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);
  }

No ayudó, ¿puedo arreglar otro código?

¿Puede decirme cómo perfeccionar el script?

Обзор рынка - Торговые операции - Справка по MetaTrader 5
Обзор рынка - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Окно "Обзор рынка" позволяет просматривать ценовые данные по торговым инструментам: котировки, ценовую статистику и график тиков. Здесь...
 
Kirill Voytseshchuk #:

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:

//+------------------------------------------------------------------+
//| 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 orden
   double symbol_max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
//--- obtener el límite de caracteres en el volumen
   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_LIMIT);

//--- obtener el volumen de la posición abierta por símbolo
   double opened_volume=PositionVolume(symbol);
   if(opened_volume>=0)
     {
      //--- si ya 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);
  }

add?

checkvolumevalue.mq5 como está escrito aquí


//+------------------------------------------------------------------+
//| Función de inicio del programa de script|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   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 volumen
   int digits=(int)MathLog10(SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP));
   if(digits<0) digits=-digits;
   else digits=0;

//--- comprobar muchos valores de volumen diferentes en el bucle
   while(volume<finish+4*step)
     {
      string descr;
      if(!CheckVolumeValue(volume,descr))
        {
         Print("Resultado de la inspección ",volume,": ",descr);
        }
        else PrintFormat("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 comerciales
   double 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 comerciales
   double 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 volumen
   double 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);
  }
//+------------------------------------------------------------------+
 
Kirill Voytseshchuk órdenes pendientes, la comprobación final tendrá este aspecto:

¿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

Почти конструктор для создания советника
Почти конструктор для создания советника
  • www.mql5.com
Предлагаю свой набор торговых функций в виде готового советника. Представленный способ позволяет получать множество торговых стратегий простым добавлением индикаторов и изменением входных параметров.
 

¿Es adecuado el código sobre el que se ha preguntado antes?

Podrías escribir las líneas necesarias a partir del artículo.