Errores, fallos, preguntas - página 2285

 
Alexey Navoykov:

Sí, pero la noción de "rápido" en su caso es muy relativa. Una cosa es que un usuario solicite un array de barras - se le acaba de copiar una zona de memoria, o que solicite una serie temporal concreta, entonces también es un simple copiado de datos con paso constante, igual al tamaño de la estructura. Y otra cosa son los cálculos y conversiones adicionales sobre cada número.

Aunque, personalmente, preferiría tener un historial comprimido, para no malgastar memoria, porque de todos modos estoy organizando mis propias matrices para almacenarlo. Así que estoy dispuesto a tolerar un pequeño retraso. Pero la mayoría de los demás usuarios te harían pedazos por ello )

p.s. Aunque lo ideal sería tener una opción de este tipo en el terminal, para elegir el modo de almacenar el historial en la memoria. Por ejemplo, si el sistema tiene poca RAM, pero un procesador rápido, sería muy útil.

Pues mira. Acabo de medir las velocidades de escritura y lectura de mi SDD. Resultó que el tiempo de escritura y lectura de 8 bytes (1 tipo de valor double o datetime o long) ~ 48 ns. Y según mis cálculos el tiempo de lectura de 8 bytes de información desde un array empaquetado es de 1-2 ns. Así, mientras que perdemos 1-2 ns en el acceso a un elemento de la estructura, ganamos 48*0,8 = 38 ns para la escritura y la lectura del disco. Además, tenemos una memoria RAM y un espacio en disco 5 veces mayor. Incluso no hablo del disco duro.

 
Nikolai Semko:

Pues mira. Acabo de medir la velocidad de lectura y escritura de mi SDD. Resulta que el tiempo de escritura y lectura de 8 bytes (1 tipo de valor double o datetime o long) ~ 48 ns. Y según mis cálculos el tiempo de lectura de 8 bytes de información desde un array empaquetado es de 1-2 ns. Así, mientras perdemos 1-2 ns en el acceso a un elemento de la estructura, ganamos 48*0,8 = 38 ns para la escritura y la lectura del disco. Además, tenemos un ahorro de memoria y espacio en disco 5 veces mayor, y ni siquiera hablo del disco duro.

No lo discuto. Hace 4 años tuvimos una discusión con Renat sobre este tema, en el momento en que los SSD eran todavía bastante infrecuentes y la gran mayoría de los usuarios estaban sentados en lentos HDD.Así que yo (con el ejemplo de mi SSD) intenté convencerle de que el funcionamiento del HDD es el eslabón más lento del sistema y que deberíamos intentar minimizar la cantidad de datos que se consumen de él, y no al revés. Pero él tenía argumentos de este tipo: no es necesario sobrecargar la CPU con trabajo extra, y todos vosotros sois tontos, no entendéis nada, etc. En general, todo como siempre )

Es cierto que las SSD se han acelerado significativamente en estos días.

Resultaque el tiempo de escritura y lectura es de 8 bytes

Pero, ¿por qué debe medirse la escritura junto con la lectura? Se supone que los datos se escriben una vez al recibirlos del servidor, bueno, o al crear una caché. Y luego sólo leer. Por lo tanto chuletas por separado, las moscas por separado.
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2018.09.10 21:28

Primero, el registro de optimización.

Tester  optimization finished, total passes 714240
Statistics      optimization done in 7 hours 31 minutes 06 seconds
Statistics      local 714240 tasks (100%), remote 0 tasks (0%), cloud 0 tasks (0%)
Core 1  connection closed
Core 2  connection closed
Core 3  connection closed
Core 4  connection closed
Core 5  connection closed
Core 6  connection closed
Core 7  connection closed
Core 8  connection closed
Tester  714240 new records saved to cache file 'tester\cache\Test.FILTER_EURUSD.rann_RannForex.M1.20180226.20180909.40.2D734373DF0CAD251E2BD6535A4C6C84.opt'

Durante esas 7,5 horas, se accedió al SSD con una enorme frecuencia. Si los ticks se leen en cada pasada, eso supone una media de 26 veces por segundo durante 7,5 horas. De ahí un parpadeo tan salvaje: más de 700 mil lecturas.


Registro de una carrera

Core 1  FILTER_EURUSD.rann_RannForex,M1: 132843 ticks, 60283 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:00:00.827 (including ticks preprocessing 0:00:00.109).
Core 1  FILTER_EURUSD.rann_RannForex,M1: total time from login to stop testing 0:00:00.967 (including 0:00:00.140 for history data synchronization)
Core 1  322 Mb memory used including 36 Mb of history data, 64 Mb of tick data

Como se ve, se utilizan ~130K ticks y 60K barras (el modo "Todo el historial" está seleccionado en el Probador). Es decir, una cantidad muy pequeña de historia.

El historial del símbolo personalizado en el Terminal contiene la siguiente cantidad de datos del historial

Saved ticks = 133331
Generated Rates = 60609

Es decir, en la historia del símbolo es muy poco más de lo que utiliza el Probador.


ZS Es una pena mirar el SSD... ¿Cuánto más rápido podría ser el Optimise? Es extraño que el sistema operativo no almacene en caché estos datos, ya que son menos de 7MB de ticks en forma descomprimida.


¿Qué carpeta de Terminal a través de mklink a RAM-disco, de modo que los datos no se lee / escribe desde SSD, pero a partir de la memoria? Estoy dispuesto a proporcionar los datos, qué tipo de speedup esto daría en la optimización.

 
Nikolai Semko:

Sí, esto es de archivo. Si he entendido bien, ahora los ticks y las barras de minutos se almacenan sin empaquetar, es decir, para una barra(estructura MqlRates) son 60 bytes, y para un tick(estructura MqlTick) son 52 bytes.
¡Es horrible! Hay que hacer algo al respecto desde hace mucho tiempo.

Entiendo que el principal problema de las matrices comprimidas es la organización del acceso rápido a cada elemento de la matriz.

Pero incluso si almacenamos sólo cada elemento 256 de un array desempaquetado y almacenamos en otros elementos sólo incrementos a los desempaquetados, podemos ver que el tamaño del array será 4-5 veces menor y el tiempo de acceso a cada elemento no aumentará demasiado (quizás 1-2 nanosegundos), pero ahorrará un tiempo enorme en guardar y leer el array desde el disco y hacia el disco.

"Todo ha sido ya robado antes que tú" (cz)

Al principio del día es una garrapata completa. Luego oferta y/o demanda y/o flipper completo, todo lo demás en incrementos si está disponible. Una media de 10 bytes por tic.

Dado que el acceso a los ticks es estrictamente secuencial, no hay problema en organizar el acceso rápido a cada elemento de la matriz

 

Una gran petición para publicar la fuente del registro "Tester\cache\*.opt". En el contenido se puede ver que el formato es muy sencillo.

Es muy necesario trabajar con los resultados de la optimización. Gracias.

 

Por alguna razón, el rendimiento del probador disminuye a medida que aumenta el número de operaciones. No hay ninguna referencia al historial de operaciones por parte del Asesor Experto.

No parece que este sea el caso.

 

En el Comprobador, se memoriza el intervalo correspondiente al modo "Todo el historial". Agrego el historial al símbolo personalizado, vuelvo a cargar el Terminal y el intervalo correspondiente a "Todo el historial" no cambia.

No puedo cambiar el modo por defecto, pero si selecciono todo el historial, lo pongo manualmente. Por favor, corrige.

 

Falta una cruz en el lugar marcado - borrando la línea correspondiente de la entrada de la caché.

Hago muchas optimizaciones. Algunos están desfasados desde hace mucho tiempo. Y no hay ningún mecanismo para eliminar estas opciones. A veces se obtiene una lista enorme y se empieza a buscar entre variantes innecesarias.

Por lo tanto, considere la posibilidad de eliminar los datos innecesarios mediante una cruz en el lugar marcado en la imagen.

 
A100:
Error durante la ejecución

Resultado: verdadero:falso:7:4

¿Cómo es que cuerdas de diferente longitud son de repente iguales? Mientras que la comparación mediante StringCompare da el resultado contrario ==

Gracias por el post, hemos cambiado el comportamiento de la comparación de cadenas carácter por carácter.

Antes las cadenas se comparaban como cadena Z (hasta el carácter nulo), ahora se comparan como cadena PASCAL (teniendo en cuenta la longitud).

Los códigos existentes con cadenas "normales" (sin caracteres Z dentro) no se verán afectados por este cambio.

 
Una gran petición en el Probador es cerrar por Oferta/Demanda si la última conocida es cero.
Razón de la queja: