¿Compensación forzada de matrices en MT5? - página 4

 
No sabía que en el 4, la inicialización con ceros se produce durante el redimensionamiento. Esto no es una comodidad, sino una tontería, que conduce a una menor velocidad de los programas. Es decir, si necesito inicializar el array con el valor -1, entonces la inicialización es doble.
Y luego se preguntan por qué MT4 es más lento.
 
Vasiliy Sokolov:

... MQL5, a diferencia de MQL4, no trata de entender lo que el usuario quiere y esto es correcto.

Sugiero ponerlo en un cartel. :) (es una broma)

Vasily, entiendo que hay algunos matices que justifican ese enfoque de MT5 a la conveniencia del programador. Y no me importa. Que así sea.

 
Реter Konow:

1. la lógica nos dice que el procedimiento de vaciado de arrays lo realiza el compilador una vez en tiempo de compilación.

Sí, tienes un problema de lógica :)

 
Nikolai Semko:
No sabía que en 4ka la inicialización por ceros se produce durante el redimensionamiento. Esto no es una comodidad, sino un sinsentido que conduce a una menor velocidad de los programas. Es decir, si necesito inicializar el array con el valor -1, la inicialización es doble.
Y luego se preguntan por qué MT4 es más lento.

En principio, podríamos añadir alguna bandera al declarar un array, que indicara al compilador que borrara el array. Sería cómodo o rápido, tú eliges.

 
Реter Konow:

En principio, podríamos añadir algún tipo de bandera al declarar un array que le dijera al compilador que borrara el array. Sería cómodo o rápido, tú eliges.

¿Qué diferencia hay? Haces la inicialización después de la redimensión, eso es todo lo que se marca.
Especialmente cuando se declara un array dinámico, el tamaño no se conoce.
 
Nikolai Semko:
Cuál es la diferencia. Se hace la inicialización después del redimensionamiento, esa es toda la bandera.
Especialmente cuando se declara un array dinámico, el tamaño no se conoce.

Sí, después de cada declaración de matriz global y después de cada cambio de tamaño de la matriz. ¿Pero qué pasa si tienes 20-30 matrices globales, algunas de las cuales cambian de tamaño en determinadas circunstancias? ¿Es necesario escribir la inicialización en los bucles en todas partes? (las matrices pueden ser bidimensionales). ¿No es una fuente potencial de errores?

 
Реter Konow:

Sí, después de cada declaración de matriz global y después de cada cambio de tamaño de la matriz. Pero, ¿qué pasa si tienes entre 20 y 30 matrices globales, algunas de las cuales cambian de tamaño en determinadas circunstancias? ¿Es necesario escribir la inicialización en los bucles en todas partes? (las matrices pueden ser bidimensionales). ¿No es esto un caldo de cultivo potencial para los errores?

Esta operación quirúrgica se realiza de forma muy sencilla. Reemplace la palabra "ArrayResize" con algo más - será el nombre de su función para redimensionar. Comprueba en él, si el redimensionamiento está arriba, entonces pasa por los nuevos elementos en el bucle y les asigna el cero.

Además, en el inite, inicializa todas las matrices que tienen tamaño (si las hay).

También puede haber matrices de un tamaño determinado en las funciones - esas también. Búsquelos utilizando corchetes.

 
Dmitry Fedoseev:

Esta operación quirúrgica se realiza de forma muy sencilla. Reemplace la palabra "ArrayResize" por otra cosa - este será el nombre de su función de redimensionamiento. En él comprueba, si el redimensionamiento es hacia arriba, entonces recorre los nuevos elementos en el bucle y les asigna cero.

Además, en el inite, inicializa todas las matrices que tienen tamaño (si las hay).

También puede haber matrices de un tamaño determinado en las funciones - esas también. Búsquelos entre corchetes.

Por cierto, sí.
Pyotr, Dmitry está diciendo algo sensato.
Una definición bien escrita le ahorrará reescribir todo el código.
 
Nikolai Semko:
Por cierto, sí.
Peter, Dimitri está diciendo algo sensato.
Una definición bien escrita le ahorrará reescribir todo el código.

Lo intentaré. Es un truco interesante.

 

Apoyaré el topicstarter, aunque hay muchas preguntas a su creación ))))

Los desarrolladores de MQL5, en la búsqueda de la velocidad de los cálculos (¿o algún otro número bonito?) han eliminado todos los "pequeños extras" que hacían a MQL4 más amigable,

Si hay una regla general en MQL5, los indicadores que se basan en MQL4 se convertirán en una "cartilla" en MQL5, y esta "cartilla" tiene que ser leída en el terminal de comercio:

1. al llamar a OnInit(), los buffers de los indicadores no se inicializan automáticamente

2. He mirado un centenar de indicadores en el kodobase, por desgracia, bajo la apariencia de la programación en MQL5 escriben indicadores en el estilo de MQL4 - amplían la numeración de las matrices y series de tiempo

3. iHighest / iLowest no funcionan lógicamente - buscan las barras con los valores más altos / más bajos en la dirección de la numeración creciente de la serie temporal... Es decir, si utilizamos el esquema estándar de los indicadores en MQL4 - cálculo desde el dato anterior hasta el presente, este problema no se resuelve con iHighest y iLowest, ya que la barra más a la izquierda es 0, y cuando se llama a iLowest, estamos buscando valores en el futuro....

4. el mismo problema con ArrayMaximum() - es difícil de usar en los indicadores... es difícil no aumentar la numeración de la serie de tiempo, tomamos y constantemente restamos del el-ta inicial algún número de barras y obtenemos ArrayMaximum(high[i], i -Period,Period)

5. por desgracia, incluso los expertos en MQL5 utilizan construcciones cuestionables.... Digamos que todavía se lleva una cierta base de muletas guardadas en la transición de MT4.


Para qué - MQL no pretende ser puro С++, por qué quitaron implementaciones más sencillas para los usuarios... Llevo como un mes revisando Python, por qué tantos trabajos en él... Es ahora cuando entiendo que Python permite a la gente ignorar las pequeñas cosas y tiene una interfaz más fácil de usar ;) - para un programador experimentado todo parece mal, pero la gente lo usa y Python es bastante popular