Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1120

 
Artyom Trishkin:

Código del problema.

¿Por qué...? Si se trata de duplicar la lógica por cada cruce de la misma línea, entonces por supuesto toda la lógica (que no escribí) debe ser escrita directamente por la persona. No sé su objetivo final, tal vez quiera hacer un recuento de las veces que el precio cruza cada línea, siempre y cuando la pase...

Entendí que el hombre no era capaz de conseguir tal evento para sus propósitos. Ahora tendrá un evento de este tipo, y luego queda a su discreción.


Lo lógico sería renombrar la propia línea con un formato determinado en el primer cruce (o poner alguna etiqueta en la descripción de esta figura). Y cuando todos los objetos estén cruzados, comprueba la ausencia de esta marca en la línea.

Si hablamos de la ineficacia de probar todos los objetos cada tick, entonces es otro tema totalmente distinto.

 
Roman:

Intente utilizar el valor devuelto por la variable _Period para los períodos superiores a H1 en sus cálculos matemáticos.
Entonces sabrá inmediatamente quién está equivocado.

Nadie en su sano juicio utilizaría los valores de las constantes nombradas para realizar cálculos matemáticos. Las constantes con nombre están ahí para facilitar la comprensión de a qué se está refiriendo, o qué identificador de propiedad está utilizando para recuperar los datos. Las constantes con nombre sustituyen el valor del identificador de la propiedad solicitada por una descripción textual.

Cuando se obtienen datos de, por ejemplo, SymbolInfoDouble(), se puede utilizar el valor numérico del identificador para indicar qué valor se quiere obtener de la función. Pero para ello, hay que recordar qué valor del identificador hay que sustituir en la función. Las constantes enum nombradas se introdujeron para liberarte de la referencia constante o para evitar que memorices de memoria el valor de cada identificador de cada función en MQL. Para obtener el valor del precio de venta actual, debe escribir el valor del identificador igual a 4 cuando solicite datos para el símbolo actual: SymbolInfoDouble(NULL,4) o escribir SymbolInfoDouble(NULL,SYMBOL_ASK);

¿Por qué te parece bien, y no causa disonancia, que SYMBOL_ASK devuelva 4 y no el precio actual de venta?

¿Por qué te metes entonces con los identificadores del periodo de la carta? Eso es lo que querían los desarrolladores. Por sus razones internas. Hay un nombre identificador para usted, por ejemplo PERIOD_H4. No debería importarle el valor numérico que le haya asignado el desarrollador por una u otra razón. Se le ha dado un nombre (sustitución textual de un valor numérico) de una constante - utilícelo para su comodidad. Pero utilizar el valor de esta constante en sus cálculos es, lo siento, una tontería. Esta constante con nombre se utiliza para indicar de qué gráfico se quieren obtener los datos. Pero no devuelve el periodo del gráfico. Se utiliza para un propósito muy diferente - para hacer su vida más fácil, para decirle a la función lo que debe devolver.

Si quieres el número de minutos del periodo, obténlo a partir del número de segundos del periodo dividido por 60. Y no llames muleta a algo que no lo es. Las muletas son lo que estás haciendo: tratar de usar nombres de números en tus cálculos.

Eso es un fastidio...

 
Vadim Lin:

¿Por qué...? Si se trata de duplicar la lógica por cada cruce de la misma línea, entonces por supuesto toda la lógica (que no escribí) debe ser escrita directamente por la persona. No sé cuál es su objetivo final, tal vez quiera hacer un recuento de las veces que el precio cruza cada línea, siempre y cuando la pase...

Entendí que el hombre no logró conseguir tal evento para sus propósitos. Ahora tendrá un evento de este tipo, y luego queda a su discreción.


Lo lógico sería renombrar la propia línea con un formato determinado en el primer cruce (o poner alguna etiqueta en la descripción de esta figura). Y cuando todos los objetos estén cruzados, comprueba la ausencia de esta marca en la línea.

Si hablamos de la ineficacia de probar todos los objetos cada tick, ese es otro tema.

Estás utilizando funciones antiguas que están a punto de desaparecer en el olvido. El código no es multiplataforma por eso, aunque se podría hacer funcionar fácilmente en cualquier plataforma sin cambios.

Y renombrar es muy divertido. Sólo hay que mirar los nombres de las líneas que da el indicador, extraer de ellos el identificador explícito y utilizarlo para encontrar las líneas correctas.

 
Vadim Lin:

¡Muchas gracias! ¡Fuewchar_t lo que ayudó! He leído sobre ello, almacena 2 bytes por carácter, a diferencia de char.

Pero el parámetro de la función "str" sigue sin devolver el valor que se le ha asignado... Me pregunto por qué...

Probablemente porque hay que devolver el valor de retorno de la función.

extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)
{
   wchar_t wcs[256];
   wcscpy(wcs, str);

   wchar_t* addStr = L" --- Привет! ---";
   
   wchar_t* res = wcsncat(wcs, addStr, wcslen(addStr) + 1);
   
   return(res);
}
 
Artyom Trishkin:

Estás utilizando funciones antiguas que están a punto de caer en el olvido. Y el código no es multiplataforma, aunque podrías hacerlo funcionar fácilmente en cualquier plataforma sin necesidad de cambios.

Y renombrar es muy divertido. Basta con mirar los nombres de las líneas del indicador, extraer el identificador explícito y utilizarlo para encontrar las líneas necesarias.

Gracias por la edición.

De hecho, he programado en MQL4 más bien poco, mientras que apenas he utilizado MQL5. Por lo tanto, admito que algunos métodos están anticuados (¡pero trabajo de todos modos!).

Нужно просто поглядеть какие имена линий выдаёт индикатор, вычленить из них их явный идентификатор

Sin duda, pero ni tú ni yo - no conocemos las peculiaridades de los nombres de esas líneas. "Memorizar" dichos niveles también es una opción, pero entonces los resultados de nuestras "memorizaciones" tendrían que ser guardados en algún lugar en un archivo, y sin eso - cada vez que el terminal se bloquee, la imagen de lo que está pasando sería muy poco clara. Renombrar, al menos, resolvería este problema, aunque este método puede no ser el mejor.

Podría estar equivocado, pero la persona escribió que se utilizan hasta 100 líneas a la vez, y sólo líneas, y no hay nada más en el gráfico. Todas las líneas, según tengo entendido, deben ser controladas para evitar cruces. Así que lo que vas a "extraer" de los nombres, no lo sé))

 
Artyom Trishkin:


La cuestión es que la variable _Period debe devolver valores de tiempo.
Y las constantes deben corresponder a valores de periodo, no sólo a constantes de enumeraciones.
De lo contrario, perdemos el sentido de esta variable, que está especialmente diseñada para obtener rápidamente el valor del marco temporal, sin necesidad de convertirlo mediante funciones adicionales.

 
Vadim Lin:

Gracias por la edición.

De hecho, he programado en MQL4 relativamente poco en los últimos años, y apenas he utilizado MQL5. Por lo tanto, admito que algunos métodos están anticuados (¡pero trabajo de todos modos!).

Sin duda, pero ni tú ni yo - no conocemos las peculiaridades de los nombres de esas líneas. "Memorizar" dichos niveles también es una opción, pero entonces los resultados de nuestras "memorizaciones" tendrían que ser guardados en algún lugar en un archivo, y sin eso - cada vez que el terminal se bloquee, la imagen de lo que está pasando sería muy poco clara. Renombrar, al menos, resolverá este problema, aunque este método puede no ser el mejor.

Podría estar equivocado, pero la persona escribió que se utilizan hasta 100 líneas a la vez, y sólo líneas, y no hay nada más en el gráfico. Todas las líneas, según tengo entendido, deben ser controladas para evitar cruces. Así que lo que va a "elegir" de los nombres, no lo sé))

Si el terminal se bloquea, habrá que reiniciarlo. El indicador tendrá que ser aplicado al gráfico de nuevo, o ejecutar el Asesor Experto que utiliza los datos de este indicador (entonces el EA cargará este indicador por sí mismo al acceder a él). En este caso (e incluso durante el reinicio normal del terminal con una carga automática de los programas instalados en el gráfico), el indicador dibujará todas sus líneas de nuevo - no hay necesidad de guardar nada. Estas líneas se pueden releer más tarde. Además, hay que leerlos de todos modos.

Para que el EA controle sólo las líneas creadas por el indicador, basta con mirar los nombres de las líneas creadas por el indicador y tratar de encontrar la subcadena que se repite en los nombres - lo mismo para todas las líneas. Estas subcadenas se utilizan para encontrar las líneas necesarias.

Es sencillo: basta con mirar la lista de objetos cuando el indicador está en marcha.

 
Roman:

La cuestión es que la variable _Period debe devolver valores de tiempo.
Y las constantes deben corresponder a valores de periodo, no sólo a constantes de enumeraciones.
De lo contrario, perdemos el sentido de esta variable, que está especialmente diseñada para obtener rápidamente el valor del marco temporal, sin necesidad de convertirlo mediante funciones adicionales.

Tienes gente y caballos mezclados por todas partes... No sólo en este tema. Si se hacen cambios de acuerdo con sus sugerencias, la mitad de todo lo que ha funcionado hasta ahora simplemente morirá.

Equiparar un tamaño de garrapata con un tamaño de punto no vale nada...

 
Roman:

Intente utilizar el valor devuelto por la variable _Period para periodos superiores a H1 en sus cálculos matemáticos.
Verás inmediatamente quién está equivocado.

Lo uso en casi todos los EA. Ya no tiene gracia. Lo siento, es la primera vez que veo esto.
 
Artyom Trishkin:

Tienes gente y caballos mezclados por todas partes... No sólo en este tema. Si se hacen cambios de acuerdo con sus sugerencias, la mitad de todo lo que hasta ahora funcionaba simplemente se extinguirá.

Sólo equiparando el tamaño de la garrapata con el tamaño del punto...

Porque hay mucha incoherencia con la realidad actual.
Y tú tratas de buscar excusas para esas incoherencias.
Por el contrario, ¡escribí que una garrapata no es igual a un punto!
Es tu propio punto interno, inventado.
En vista de que Point solía corresponder exactamente a un punto, cuando sólo había un cuatro dígitos.
Pero después de la introducción del quinto dígito, empezaste a inventar nombres con tus excusas.

Razón de la queja: