Errores, fallos, preguntas - página 1930

 
Una pregunta casi infantil: ¿por qué es así?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

Por alguna razón, estaba seguro de que DoubleToString no tenía sentido después de la normalización. Pero no, como muestra el guión. ¿Por qué es así?

Parece que la conversión doble -> cadena no funciona correctamente.

 
Las funciones PositionGet son muy lentas en el probador. Para fines de demostración, se escribió el siguiente Asesor Experto
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


Resultado de la ejecución única con líneas amarillas comentadas

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


Resultado de una sola ejecución con líneas amarillas NO comentadas

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


Labiblioteca TesterBench muestra el mismo descenso en el tiempo de ejecución.


HH No sólo PositionGet, sino también OrderGet, HistoryDealGet, HistoryOrderGet son lentos.

 

En el probador (1629) las operaciones se abren a precio cero

Ejecutando el Asesor Experto en el probador utilizando ticks reales del Servidor FIBOGroup-MT5


 

Pregunta para desarrolladores y colegas interesados.

En Tester en modo de visualización hay un objeto de la clase CiMA - muwings.

Modo = "Cada tick basado en ticks reales". La velocidad en el visualizador está cerca del máximo.

El problema es este. Cuando aparece una nueva barra, hay que esperar un montón de nuevos ticks para refrescar los valores de los muwings de CiMA, o mejor dicho, los valores del buffer de muwings.

Y en cada tick se acelera la actualización mediante el método CiMA::Refresh(-1).

¿Por qué funciona tan mal el probador?

No hay tales problemas en el comercio real.

 

Pusha es un extraño en estos días:

uest/302788

solicitud/302788

Como puedo adivinar, fui yo el que se puso como candidato y lo comentó en el mismo orden.

Pero los mensajes son como para los codificadores)

 

De la documentación

ENUM_BASE_ESQUINA

Identificador

Descripción

ESQUINA_IZQUIERDA_SUPERIOR

Centro de coordenadas en la esquina superior izquierda del gráfico

ESQUINA_IZQUIERDA_INFERIOR

Centro de coordenadas en la esquina inferior izquierda del gráfico

ESQUINA_DERECHA_INFERIOR

Centro de coordenadas en la esquina inferior derecha del gráfico

ESQUINA_DERECHA_SUPERIOR

centro de coordenadas en la esquina superior derecha del gráfico

Pregunta: ¿Por qué no se puede dibujar la tabla en orden numérico? Pones 1 - y en lugar del esperado "Centro de coordenadas en laesquina superior izquierda del gráfico" obtienes"Centro de coordenadas en la esquina inferior derecha del gráfico".

Ahora se ve así

1 - Centro de coordenadas en la esquina inferior izquierda del gráfico.
2 - Centro de coordenadas en la esquina inferior derecha del gráfico
3 - Centro de coordenadas en la esquina superior derecha del gráfico
4 - Centro de coordenadas en la esquina superior izquierda del gráfico

 
Aleksey Vyazmikin:

De la documentación

ENUM_BASE_ESQUINA

Identificador

Descripción

ESQUINA_IZQUIERDA_SUPERIOR

Centro de coordenadas en la esquina superior izquierda del gráfico

ESQUINA_IZQUIERDA_INFERIOR

Centro de coordenadas en la esquina inferior izquierda del gráfico

ESQUINA_DERECHA_INFERIOR

Centro de coordenadas en la esquina inferior derecha del gráfico

ESQUINA_DERECHA_SUPERIOR

centro de coordenadas en la esquina superior derecha del gráfico

Pregunta: ¿Por qué la tabla no puede estar en orden numérico? Pones 1 - y en lugar de lo esperado "Centro de coordenadas en laesquina superior izquierda del gráfico" obtienes"Centro de coordenadas en la esquina inferior derecha del gráfico".

Se ve así

1 - Centro de coordenadas en la esquina inferior izquierda del gráfico.
2 - Centro de coordenadas en la esquina inferior derecha del gráfico
3 - Centro de coordenadas en la esquina superior derecha del gráfico
4 - Centro de coordenadas en la esquina superior izquierda del gráfico

El recuento comienza desde cero.

¿Qué le impide introducir CORNER_LEFT_UPPER en lugar de un número? Para eso está la enumeración, para no tener que pensar en los números.

 

En el servicio de asistencia

MT4:

Para objetos con tamaño fijo: las propiedades OBJ_BUTTON, OBJ_RECTANGLE_LABEL y OBJ_EDIT OBJPROP_XDISTANCE y OBJPROP_YDISTANCE establecen la posición del punto superior izquierdo del objeto respecto a la esquina del gráfico (OBJPROP_CORNER), a partir de la cual se contarán las coordenadas X e Y en píxeles.


MT5:

Para los objetos con tamaño fijo: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT y OBJ_CHART, las propiedades OBJPROP_XDISTANCE y OBJPROP_YDISTANCE establecen la posición del punto superior izquierdo del objeto con respecto a la esquina del gráfico (OBJPROP_CORNER), desde la cual se medirán las coordenadas X e Y en píxeles.

La cuestión es que la versión antigua de MT4 que utiliza ObjectSet permite colocar los objetos en relación con sus bordes (esquinas) - para los objetos de la parte izquierda el cálculo de los píxeles se realiza a partir del primer símbolo, para los objetos de la parte derecha - a partir del último símbolo, mientras que la nueva versión siempre realiza el cálculo a partir del primer símbolo, lo que dificulta el posicionamiento de las etiquetas con texto, porque no siempre se sabe cuántos símbolos de texto habrá. Pido a los desarrolladores que añadan la posibilidad de elegir el método de alineación del texto.

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }  


Si alguien sabe cómo conseguir la alineación a la izquierda y a la derecha en MT5, por favor, comparta la función correspondiente.

 
Artyom Trishkin:

El recuento comienza desde cero.

¿Qué le impide introducir CORNER_LEFT_UPPER en lugar de un número? Para eso está la enumeración, para no tener que pensar en los números.

¿Desde cero? Bueno, vale - que sea de cero - no lo he tenido en cuenta - ¡pero sigue sin funcionar!

Porque tiene más sentido para mí y lo he usado antes.

 
Aleksey Vyazmikin:

¿Desde cero? Bueno, está bien - aunque sea desde cero - no lo he tenido en cuenta - ¡pero sigue sin funcionar!

Porque tiene más sentido para mí y lo he usado antes...

¿Debo adelantar el punto de la lista que tratas de identificar con el número 4, que no está ahí? Se convierte en cero - y todo está en su lugar.

Razón de la queja: