Ayúdame a aprender a programar. - página 4

 

Dmitry Fedoseev:
Recalcula cada vez, o no recalcula

No has entendido nada. El mundo no ha llegado a su fin con PositionTotal(). Sólo señalo que es un error hacerlo.

Dmitry Fedoseev:
Pero en lugar de traer un experimento asesino

¿Qué no te gusta de mi experimento? ¿El compilador ha sobreoptimizado el resultado de la primera llamada?

Esto es exactamente lo que optimiza: for (int i = 0; i < 1+2 ; i++) {}

o esto: const int X = 1 ;for (int i = 0; i < X+2; i++) {}

pero esto definitivamente no es: int X = 1 ; for (int i = 0; i < X+1; i++) {} porque no soy un telépata y no sé qué y dónde puede ocurrir con esta X - puede ser modificada dentro del bucle o indirectamente, por ejemplo, por un enlace/puntero? Hará la suma 'X+1' en cada iteración. Aunque elimine '+1', el programa seguirá utilizando el valor actual de 'X' a menos que esta 'X' se declare como una constante.

Y ciertamente no almacena en caché el resultado devuelto por la función, Karl! (anticipándose a tu "¿y si para (int index=f();)") - sólo hay una llamada aquí, en la inicialización del índice).

Dmitry Fedoseev:
Y el compilador - me refiero a que optimiza el código y llama a la variable directamente, no a través de una función

Sí, por supuesto, el compilador sabe exactamente la situación en el mercado y está seguro de que una llamada a la función siempre devuelve el mismo valor, así que por qué llamar a esta función más de una vez en absoluto, sólo hay que recordar el resultado en OnInit() una vez y ¡bien!

¿Y no le importa que incluso dentro de la propia ejecución del ciclo, en su caso con PositionsTotal(), algunas órdenes ya se hayan ido -paradas, cerradas por las manos o por otro EA- y el resto no se procesen, porque todas, de repente, se han reducido?

Dmitry Fedoseev:
Esto es claramente visible con la función ArraySize(), no se nota la diferencia entre llamar a la función y usar una variable. Pero no es así con PositionsTotsl(), por desgracia.

¿Qué relación existe entre el tamaño de una matriz y el número de posiciones abiertas actualmente? Estás accediendo a los elementos del array por un índice, pues, por ejemplo, accede al array[999] con un tamaño de 3 elementos. Si este array es realmente un tipo "inteligente", una clase allí por ejemplo con el operador '[]' donde se realiza la comprobación de validez, entonces bien. Pero, ¿y si no lo es? De todos modos, este es un ejemplo clásico de shithcode. Por qué debemos gasificar el charco, simplemente admitirlo y no molestar.

 
Tio Nisla:

Dmitry Fedoseev:
Recalcula cada vez, o no recalcula

No has entendido nada. El mundo no ha llegado a su fin con PositionTotal(). Sólo señalo que es un error hacerlo.

Dmitry Fedoseev:
Pero en lugar de traer un experimento asesino

¿Qué no te gusta de mi experimento? ¿El compilador ha sobreoptimizado el resultado de la primera llamada?

Esto es exactamente lo que optimiza: for (int i = 0; i = 1+2; i++) {}

o esto: const int X = 1 ;for (int i = 0; i = X+2; i++) {}

pero esto definitivamente no es: int X = 1 ; for (int i = 0; i = X+1; i++) {} porque no soy un telépata y no sé qué y dónde puede ocurrir con esta X - puede ser modificada dentro del bucle o indirectamente, por ejemplo, por un enlace/puntero? Hará la suma 'X+1' en cada iteración. Aunque elimine '+1', el programa seguirá utilizando el valor actual de 'X' a menos que esta 'X' se declare como una constante.

Y ciertamente no almacena en caché el resultado devuelto por la función, Karl! (anticipando tu "pero qué pasa si para (int index=f();)") - sólo hay una llamada aquí, en la inicialización del índice).

Dmitry Fedoseev:
Y el compilador - me refiero a que optimiza el código y llama a la variable directamente, no a través de una función

¡Bueno, sí, por supuesto, el compilador sabe exactamente la situación en el mercado y está seguro de que una llamada a la función siempre devuelve el mismo valor, así que por qué llamar a esta función más de una vez en absoluto, usted tiene que almacenar el resultado en OnInit () una vez, y bien!

¿Y no le importa que incluso dentro de la propia ejecución del ciclo, en su caso con PositionsTotal(), algunas órdenes ya se hayan ido -paradas, cerradas por las manos o por otro EA- y el resto no se procesen porque todas, de repente, se han reducido?

Dmitry Fedoseev:
Esto es claramente visible con la función ArraySize(), no se nota la diferencia entre llamar a la función y usar una variable. Pero no es así con PositionsTotsl(), por desgracia.

¿Qué relación existe entre el tamaño de una matriz y el número de posiciones abiertas actualmente? Estás accediendo a los elementos del array por un índice, pues, por ejemplo, accede al array[999] con elementos de tamaño 3. Si este array es realmente un tipo "inteligente", una clase allí por ejemplo con el operador '[]' donde se realiza la comprobación de validez, entonces bien. Pero, ¿y si no lo es? De todos modos, este es un ejemplo clásico de shithcode. Será mejor que no intentes gasificar la situación.

Si no hay un final a la vista en PositionTotal(), ha perdido el objetivo en absoluto. Porque la función ArraySize() puede ser llamada en cada repetición del bucle, y la velocidad no cambia.

No estoy satisfecho con su experimento debido a su ausencia.

Todas tus otras fantasías no son interesantes porque son fantasías (y además, son descabelladas y muy alejadas de la realidad e incluso falsas).

Deberías estar en el jardín de infancia.

 
Dmitry Fedoseev:

¿Con el conocimiento de qué? Si es un algoritmo que no existe en la naturaleza, sino que hay que inventarlo uno mismo, y lo define todo.

Con el conocimiento de cómo escribir competentemente el código correcto en el lenguaje de interés.

No lo entiendo, ¿no hay ningún algoritmo que pueda hacer esto?

¿Cómo recoger información sobre las transacciones y utilizarla? Necesito recoger información sobre todas las posiciones del EA, su volumen, beneficio, tipo, precio de apertura. Y, a continuación, para referirse a la información sobre la posición más reciente, o la posición más grande.

De hecho, el autor ha creado el tema con esta pregunta.

Y los ciclos y el desempeño de las funciones fueron discutidos por otros. Pero también son los que quieren saber cuál es la mejor manera o el camino correcto.

 
Nikolay Mitrofanov:

Con el conocimiento de cómo escribir el código correcto de manera competente en el lenguaje de interés.

No entiendo, ¿no hay ningún algoritmo que pueda hacer esto?

Así que el autor creó el tema con esta pregunta en mente.

Y sobre los bucles y el rendimiento de las funciones se interesaron otras personas. Por así decirlo, más sofisticados en la realización de dichos algoritmos) Pero también son ellos los que quieren saber cómo hacerlo mejor o cómo hacerlo bien.

Y entonces, ¿todavía se trata de cómo calcular las posiciones? Bueno, entonces lo siento.

Interesante estos sofisticados, que todavía quieren saber... y todavía no saben. ¿Y también se trata de contar posiciones?

Perdón de nuevo, no me equivoco, con la frase "implementación del algoritmo" ¿te refieres a una función de conteo de posiciones? Es decir, tanto si escribes PositionsTots() en un bucle como si utilizas una variable, ¿llamas a esto un algoritmo?
 
Dmitry Fedoseev:

¿Y todavía estáis hablando de cómo contar las posiciones? Bueno, lo siento entonces.

Interesante estos sofisticados que todavía quieren saber... y todavía no saben. ¿Y eso también es contar posiciones?

Entonces, ¿para qué argumentar si la pregunta está agotada)? LOL.

Hay una tarea para obtener datos de posición.

Existe una función del lenguaje para obtener el número de posiciones abiertas, que se utiliza en el bucle.

Existe la duda de cómo utilizarlo correctamente en el bucle: en el primer parámetro del bucle for o por el segundo - donde se comprueba la condición.

Es extraño que no entiendas lo que quieres)))

Usted escribe que es costoso porque el número no es constante. Pero el por qué, no se puede explicar.

¿Puede explicar por qué es costoso?

Personalmente creo que los desarrolladores se aseguraron de que esta función no recalculara las posiciones abiertas cada tick, y que sólo lo hiciera al abrir y cerrar una posición.

¿Crees que los desarrolladores no han pensado en esto?

¿Cómo puedes estar tan seguro de que la función es costosa y recalcula, y no se limita a tomar el valor de la memoria del terminal?

Hasta ahora, en lugar de una respuesta sustantiva, he leído cháchara.

 
Nikolay Mitrofanov:

Entonces, ¿para qué discuten si la cuestión ha terminado)? LOL.

Así es el humor de la situación: durante las segundas veinticuatro horas en la página cuatro un simposio sobre cómo contar las posiciones. Muy interesante.

 
Dmitry Fedoseev:

Si PositionTotal() no es lo único que importa, entonces se ha perdido el punto. Porque la función ArraySize() puede ser llamada en cada repetición del bucle, y la velocidad no cambia.

No estoy satisfecho con su experimento debido a su ausencia.

Todas tus otras fantasías no son interesantes, porque son fantasías (y además, son descabelladas y muy alejadas de la realidad, e incluso falsas).

ArraySize(), si un array no es dinámico o de un tipo de clase, ya es una constante al declarar el propio array. Pero no significa nada todavía, porque ArraySize(array) y sizeof(array) son dos grandes diferencias. La primera se llama pero no se ve; la segunda se calcula en la fase de compilación.

int arr[5];

PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
ArrayResize(arr, 7);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));
ArrayResize(arr, 3);
PrintFormat("ArraySize(): %d\n", ArraySize(arr));
PrintFormat("sizeof(array): %d, num_elem = %d\n", sizeof(arr), sizeof(arr) / sizeof(int));

2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: initialized
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 3
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5
2021.05.03 22:01:37.253 show_the_shitz EURJPY,H4: ArraySize(): 7
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: ArraySize(): 5
2021.05.03 22:01:37.252 show_the_shitz EURJPY,H4: sizeof(array): 20, num_elem = 5

Así que cuente su punto de vista alternativo en otro lugar.

-----------------

¿Por qué estoy tratando de explicarme? Una persona no quiere ver y pensar. Muy bien, que genere un código cuyo funcionamiento dependa de la fase lunar, la hora media del meridiano de Marte y el picor del talón trasero izquierdo. La única pena es que mucha gente, sobre todo los novatos, copian *código nuevo* en sus proyectos sin pensarlo dos veces y luego se preguntan qué es lo que está mal.

 
Tio Nisla:

ArraySize(), si el array no es dinámico y no es de tipo clase, ya es una constante al declarar el propio array. Pero esto tampoco significa nada, porque ArraySize(array) y sizeof(array) son dos grandes diferencias. La primera se llama pero no se ve; la segunda se calcula en la fase de compilación.

Así que cuente su punto de vista alternativo en otro lugar.

-----------------

¿Por qué estoy tratando de explicarme? Una persona no quiere ver y pensar. Muy bien, que genere un código cuyo funcionamiento dependa de la fase lunar, la hora media del meridiano de Marte y el picor del talón trasero izquierdo. La única pena es que mucha gente, especialmente los novatos, ni siquiera se lo piensa dos veces a la hora de copiar *código nuevo* en sus proyectos y luego se preguntan qué es lo que falla.

¡Ese es un argumento de muerte! No hay palabras... ¿Por qué hay que aplicar ArraySize() a un array no dinámico? No puedo imaginar cómo se le puede ocurrir a uno. ¿Y qué tiene que ver sizeof() con esto? ¿Todo bien ahí?

Y este no es mi punto de vista, sino uno que ha sido verificado desde hace tiempo por los participantes del foro. Pero no voy a buscar este hilo.

Pero puedo decirte que no tiene nada que ver con el almacenamiento en caché.

 
Nikolay Mitrofanov:

Para mí, creo que es bueno que una persona intente comprender y profundizar...

Al no prestar atención a los pequeños detalles, el programador adquiere el hábito de escribir código de forma incorrecta. Y luego, peinar el código supone un doble trabajo y, a menudo, no sólo para el autor, sino para los que todavía tienen la suerte de trabajar con el código.

¿Por qué molestarse en escribir código cuando se puede hacer correctamente y escribirlo bien y entender los detalles?)

Su consejo es... bueno... IMHO


Su consejo es bueno para un programador con experiencia (fuertemente seguro de sí mismo) que luego puede peinar, porque sabe dónde y qué hay que peinar.

Fedoseyev tiene razón. No es necesario, y le llevará algún tiempo peinar el código como le gustaría. Pero con el tiempo entiendes que es mejor escribir algo nuevo. Así que cada nuevo código será peinado al principio.

 

Interesantes realidades del foro. Cuando alguien pregunte sobre algo, nadie escribirá una línea de código. Pero tan pronto como lo hacen, vienen, se alinean y comienzan a golpear - ah, ah, ah, qué código equivocado. Y lo que es interesante, suele tratarse de un código tan simple como tres kopecks. Todos los espacios están bajo escrutinio. En cuanto a algo más complicado, está el silencio, sordo como una cuba.