Errores, fallos, preguntas - página 2823

 
Nikolai Semko:

decidió comprobar la versión de la velocidad de ramificación.
Y el resultado fue sorprendente.
La comparación incluso de doble prenormalizado es incluso más lenta en promedio que si se compara el doble a través de épsilon o a través de la conversión a int

El resultado:

No descarto que muchas cosas dependan de la novedad y la arquitectura del procesador y algunos programadores puedan obtener un resultado diferente.

Sorprendentemente, la función de redondeo a entero devuelve un número real, no un entero, y hay que redondear el tipo a un entero también. ¿Dónde está la lógica del lenguaje?
 
Nikolai Semko:

¿Depende el rendimiento de la operación de comparación de dos dobles de los valores de las propias variables? Lo dudo.

Parece que es así. Es bastante extraño.
Si sustituye la línea del ejemplo anterior

double test = 1.11;

a

double test = NormalizeDouble(1.11,2);

la simple comparación de dos dobles empieza a funcionar más rápido que otras opciones. Aunque puede ser doble o doble. ¿Qué diferencia parece? Pero el rendimiento resultante es dos veces más rápido. Es como un milagro.

2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 1 - 552 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   простое сравнение предварительно нормализированых double 2 - 954 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через эпсилон                             - 778 микросекунд, всего совпадений = 507
2020.08.10 17:40:13.583 TestCompareDouble (USDCAD,H4)   сравнение double через преобразование в int                - 854 микросекунд, всего совпадений = 507
Archivos adjuntos:
 
Alexey Navoykov:

La prueba es incorrecta. ¿Por qué se divide por 100000,0 sólo una vez al final? Debería realizarse en cada iteración y luego sumarse. Es una comparación justa. Pero esto no es una normalización en absoluto, sólo ha optimizado su algoritmo de prueba. Por supuesto, será más rápido y más preciso (ya que se reduce el error acumulado).

Sí, tienes razón. La precisión será la misma que con NormalizeDouble si se divide en cada iteración. Pero la velocidad seguirá siendo mayor que con NormalizeDouble.

2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   простая сумма                            - 1394 микросекунд, сумма = -3604329.1567609389312565
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма с NormalizeDouble                  - 5861 микросекунд, сумма = -3604329.1543100476264954
2020.08.10 21:38:48.652 TestCompareDouble (USDCAD,H4)   сумма, нормализированная через int       - 2179 микросекунд, сумма = -3604329.1543100476264954

Gracias.

 

En general, después de redondear a un número entero, devolver un número no entero no es bueno. Anteriormente en las impresoras he visto números casi enteros con ceros después del punto decimal y uno al final, o con nueves después del punto decimal. Pensé que era un error. Resulta ser una posición poco clara de los desarrolladores. Bueno, redondeando a enteros, deberías eliminar el resto después del punto decimal en forma binaria pero aparentemente es difícil/imposible poner a cero la mantisa. Acerca de la normalización es aún más complicado, incluso si nos movemos una coma a 5 dígitos y entero en binario, el redondeo inverso a doble dará una diferencia con el tipo entero.

Lamentablemente, hay que recurrir a operaciones de comparación aparentemente sencillas.

No python.))))

 
Valeriy Yastremskiy:

En general, después de redondear a un número entero, devolver un número no entero no es bueno. Anteriormente en las impresoras he visto números casi enteros con ceros después del punto decimal y uno al final, o con nueves después del punto decimal. Pensé que era un error. Resulta ser una posición poco clara de los desarrolladores. Bueno, redondeando a enteros, deberías eliminar el resto después del punto decimal en forma binaria pero aparentemente es difícil/imposible poner a cero la mantisa. Acerca de la normalización es aún más complicado, incluso si nos movemos una coma a 5 dígitos y entero en binario, el redondeo inverso a doble dará una diferencia con el tipo entero.

Lamentablemente, tenemos que crujir en operaciones de comparación aparentemente sencillas.

Las expresiones después del redondeo pueden contener algunas otras operaciones con los datos resultantes, y no necesariamente enteros. Entonces tendremos que volver a convertirlo a double desde int, creando una sobrecarga en el momento.

Nadie le impide crear sus propias funciones RoundInt o RoundLong, que devolverán el tipo requerido.

 

Hay un problema con el probador en el mercado.

Si pruebo un EA multidivisa, el probador se cuelga.

La razón: Durante el análisis del instrumento financiero, el Asesor Experto tropieza con los instrumentos sin historia o el instrumento no está diseñado correctamente.

En el terminal estándar se cuelga durante 29 segundos, eso es seguro y está comprobado.

El probador del Mercado informa de que las pruebas son demasiado largas.

Supongo que el Asesor Experto se encuentra con varios de estos instrumentos financieros rotos.

Este problema se ha escrito varias veces y hace un año, pero sigue ahí....

 
Vladimir Pastushak:

Este problema se ha escrito varias veces y hace un año, pero sigue ahí....

No me funciona. Por favor, adjunte su código fuente.

 

¿Puede comentar por qué la función no funciona? No pasa a 0 gráfico.

ChartSetInteger(0,CHART_BRING_TO_TOP,0,true);

La segunda y posterior aplicación del patrón duplica las ventanas

ChartApplyTemplate(0,"Template.tpl");

Estas funciones funcionaban antes de la actualización.

 
fxsaber:

A mí no me toca. Adjunte su código fuente.

Prueba en los servidores de Demo Metakvotes

void OnStart()
  {
   int m_all_symbols = SymbolsTotal(false);
   string m_sym_name = "";
   for(int i = 0; i < m_all_symbols; i++)
     {
      // ======================================================================
      // === Получили имя символа
      if((m_sym_name = SymbolName(i, false)) != NULL)
        {
         // ======================================================================
         // === Если символ не выбран в окне маркет ватч
         if(!SymbolInfoInteger(m_sym_name, SYMBOL_SELECT))
            if(!SymbolSelect(m_sym_name, true))
               Print(" SymbolSelect " + m_sym_name);
         ulong get = GetMicrosecondCount();
         MqlRates rateM1[1440];
         if(CopyRates(m_sym_name, PERIOD_M1, 0, 1440, rateM1) > 0)
           {
            Print(m_sym_name, "  ", (GetMicrosecondCount() - get));
           }
         else
            Print("Error  ",m_sym_name, "  ", (GetMicrosecondCount() - get));
        }
     }
  }


2020.08.11 20:20:55.657 test (EURUSD,M15) MXNJPY 1998

2020.08.11 20:20:55.659 test (EURUSD,M15) NZDMXN 1979

2020.08.11 20:20:55.661 test (EURUSD,M15) USDCOP 1973

2020.08.11 20:20:55.663 test (EURUSD,M15) USDARS 2093

2020.08.11 20:20:55.665 test (EURUSD,M15) USDCLP 1929

2020.08.11 20:21:25.259 test (EURUSD,M15) Error AUS200 29593673

2020.08.11 20:21:54.837 test (EURUSD,M15) Error FCHI40 29578404

2020.08.11 20:22:24.336 test (EURUSD,M15) Error GDAXIm 29498485

2020.08.11 20:22:53.949 test (EURUSD,M15) Error HSI50 29612968

2020.08.11 20:23:23.458 test (EURUSD,M15) Error Jap225 29509059

2020.08.11 20:23:52.919 test (EURUSD,M15) Error ND100m 29461316

2020.08.11 20:24:22.425 test (EURUSD,M15) Error SP500m 29505571

2020.08.11 20:24:51.860 test (EURUSD,M15) Error SPN35 29435460

2020.08.11 20:25:21.273 test (EURUSD,M15) Error STOX50 29412578

2020.08.11 20:25:50.663 test (EURUSD,M15) Error UK100 29389644

2020.08.11 20:26:20.205 test (EURUSD,M15) Error Brent 29542597

2020.08.11 20:26:49.667 test (EURUSD,M15) Error Crudo 29462066

2020.08.11 20:27:19.194 test (EURUSD,M15) Error NatGas 29526780




 
Vladimir Pastushak:

Pruebas en servidores de demostración de Metacvots

Perdón, ahora está colgado....

Este script no hizo que el Terminal se colgara en mi máquina.

Razón de la queja: