Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 919

Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
El cálculo de su indicador es desde el principio hasta el final (desde los datos históricos más recientes hasta los datos actuales más recientes). Esto es una indicación de indexación como en las series temporales. Así que las matrices deben ser indexadas en consecuencia, que es lo que tienes.
¿Qué tiene de malo?
Todo funciona igual que mi port en MQL5 desde MQL4, pero veo que el código es feo por culpa deArraySetAsSeries(), por eso preguntaba
aquí están los dos códigos
¡enséñame a escribir este indicador para MT5! - Mi código no es agradable, ¡y punto! )))
ZSZ no recuerdo cómo escribir indicadores para MT5, se sentó y lo reescribió en 40 minutos usando la Ayuda, pero el resultado ... ¡imho, no tan bueno ((!
Sí, todo funciona exactamente como mi puerto en MQL5 desde MQL4, pero veo que el código es feo debido aArraySetAsSeries(), así que pregunté
aquí están los dos códigos
¡enséñame a escribir este indicador para MT5! - Mi código no es agradable, ¡y punto! )))
Cuando se invierte el bucle, hay que hacer las matrices de series de tiempo, de lo contrario la indexación de los búferes en el bucle no coincidirá con la indexación de los datos requeridos - el índice del bucle en la matriz de los búferes del indicador irá desde el principio hasta el final, mientras que en open[], high[], low[], close[] y otros - desde el final hasta el principio. O bien, puede invertir el bucle para que coincida con su indexación de arrays open[], high[], low[], close[] y el resto con la indexación de buffers, lo cual es más complicado.
Si quieres una alegoría para que quede más claro, aquí tienes una alegoría:
Estás parado en las vías del tren y mirando dos trenes. O bien van en una dirección - ambos de izquierda a derecha (ArraySetAsSeries(array,true) - primer tren y un bucle de límite a 0 - segundo tren),
O van hacia el otro - (ArraySetAsSeries(array,false) - de derecha a izquierda - primer tren, y el bucle de límite a 0 - de izquierda a derecha - segundo tren)
Y, sí: no he mirado el código - no quiero descargar, guardar (ya hay mucho código innecesario del foro), compararlos entre sí...
Sería más fácil ponerlos en códigos en el mensaje - uno y otro - entonces sería visible de una vez qué a qué.
O dar la vuelta al bucle para que coincida con su indexación de arrays open[], high[], low[], close[] y el resto, que es más difícil.
Llevo toda la noche dando marcha atrás, se me ha acabado la paciencia (((
Por lo que entiendo el problema:
- en MT5 las matrices que se asignan a los buffers de los indicadores se indexan de izquierda a derecha por defecto;
- en MT5 las series temporalesopen[], high[], low[], close[] disponibles en OnCalculate() se pasan siempre indexadas de derecha a izquierda
- es decir, basándose en los pasos 1 y 2, para calcular el indicador desde el final de la historia hasta la barra cero
a) o reasignar la indexación de las matrices del buffer
b) o hacer un bucle en el que los elementos del array se recalculen de izquierda a derecha, y en otro bucle de derecha a izquierda:
es decir,no hay una solución hermosa a mi pregunta? opción a) - en mis fuentes se implementa, la opción b) - no veo el punto de hacer cálculos adicionales
fuentes:
MT5:
MT4:
He estado flipando toda la noche, pero se me ha acabado la paciencia (((
por lo que entiendo el problema:
- en MT5 las matrices que se asignan a los buffers de los indicadores se indexan de izquierda a derecha por defecto;
- en MT5 las series temporalesopen[], high[], low[], close[] disponibles en OnCalculate() se pasan siempre indexadas de derecha a izquierda
- es decir, basándose en los pasos 1 y 2, para calcular el indicador desde el final de la historia hasta la barra cero
a) o reasignar la indexación de las matrices del buffer
b) o hacer un bucle en el que los elementos del array se recalculen de izquierda a derecha, y en otro bucle de derecha a izquierda:
es decir,no hay una solución bonita a mi pregunta... variante a) - en mis fuentes está implementada, variante b) - no veo el sentido de hacer cálculos extra
Todas las matrices están indexadas de derecha a izquierda. Por lo tanto, para cumplir plenamente con el bucle de izquierda a derecha (y es de izquierda a derecha - de límite a 0), es necesario establecer todas las matrices utilizadas a la indexación requerida : buffers en OnInit(), timeservers utilizados - en OnCalculate().
O bien, hacer el ciclo de 0 a límite, que no siempre es fácil de hacer al portar de mql4 a mql5.
Por lo tanto, la opción ArraySetAsSeries() es mejor en este caso.
Todas las matrices están indexadas de derecha a izquierda. Por lo tanto, para cumplir plenamente con el bucle de izquierda a derecha (y es de izquierda a derecha desde el límite hasta el 0), es necesario establecer todas las matrices utilizadas a la indexación requerida : buffers en OnInit(), timeservers utilizados - en OnCalculate().
O bien, tienes que hacer el ciclo de 0 a límite, que no siempre es fácil de hacer cuando mql4 es portado a mql5.
Por eso en este caso el método ArraySetAsSeries() funciona mejor.
Mira, elimina todos losArraySetAsSeries() de tu código(arriba en Init() y OnCalculate() en las primeras líneas) y corrige el bucle:
for(i=0;i<limit;i++)
En teoría, todo debería encajar, pero no, los gráficos son diferentes, y eso es lo que no puedo entender.
Mira, he eliminado todos losArraySetAsSeries() de mi código(al principio en Init() y en OnCalculate() en las primeras líneas) y he arreglado el bucle:
for(i=0;i<limit;i++)
En teoría, todo debería encajar, pero no, los gráficos resultaron diferentes y eso es lo que no puedo entender.
Te digo que es más complicado que eso. Hay que cambiar la lógica. No basta con invertir el bucle.
He aquí un pequeño ejemplo: en el código hay
Buf_NTLine1[i+1])
¿Dónde irá el índice i+1 cuando las matrices estén indexadas de forma diferente?
Y hay mucho. IHighest() - inicio y número. ¿Dónde empieza en una indexación y dónde en otra?
Y así sucesivamente...
y hay mucho. IHighest() - inicio y número de... ¿Dónde empieza en una indexación y en la otra?
¡¡¡Oh, hombre!!! ¡¡¡Bien hecho!!! ¡¡¡Sí, esa es la parte difícil!!!
Sí... muchas diferencias en MT5, muchas comprobaciones y todo tipo de precauciones en la cabeza del programador...
Cuando lo vi no hace mucho tenía un mensaje de que en MT5 no siemprese inicializa todocorrectamente enInit(), parece queInit() puede terminar incluso si los timeframes no están listos.
Ayer vi un error: si este indicador en MT5 cambia de timeframe, a veces los buffers del indicador pueden no estar vacíos - parece que los valores antiguos permanecen si no para asignar un valor específico a cada elemento del array del indicador en OnCalculate(), intentéponer ArrayInitialize(arr, 0.0) enInit()- también funciona, luego no...
por lo que entiendo correctamente:
- en MT5, en la inicialización enInit(), los buffers de los indicadores no se inicializan automáticamente? (en MT4 no recuerdo que haya quedado nada en los buffers)
- en MT5 enInit() los tamaños de las matrices debuffers pueden ser desconocidos si el historial no está cargado, por esoArrayInitialize(arr, 0.0) tampoco inicializa siempre los buffers correctamente?
¡Maldita sea! ¡Eso es! ¡Bien hecho! ¡Sí, esa es la parte divertida!
Sí... Hay muchas diferencias en MT5, el programador tiene muchas comprobaciones y todo tipo de precauciones...
Cuando lo vi no hace mucho tenía un mensaje de que en MT5 no siemprese inicializa todocorrectamente enInit(), parece queInit() puede terminar incluso si los timeframes no están listos.
Ayer vi un error: si este indicador en MT5 cambia de timeframe, a veces los buffers del indicador pueden no estar vacíos - parece que los valores antiguos permanecen si no para asignar un valor específico a cada elemento del array del indicador en OnCalculate(), intentéponer ArrayInitialize(arr, 0.0) enInit()- también funciona, luego no...
por lo que entiendo correctamente:
- en MT5, en la inicialización enInit(), los buffers de los indicadores no se inicializan automáticamente? (en MT4 no recuerdo que haya quedado nada en los buffers)
- en MT5 enInit() los tamaños de las matrices debuffers pueden ser desconocidos si el historial no está cargado, por esoArrayInitialize(arr, 0.0) tampoco inicializa siempre los buffers correctamente?
No se ha entrado en la lógica de la misma.
No se ha entrado en la lógica de la misma.
Este es el camino correcto: no ponga puntos de entrada en el precio máximo/mínimo, mejor en el precio de apertura.
Y las líneas deberían eliminarse: ¿para qué están en el gráfico? ¿Aunque sólo sea para arrastrar una parada sobre ellos?
declaración sin tipo
Si compilo un archivo de inclusión, no hay error. Si compilo el archivo del programa principal donde incluyo este archivo de inclusión, hay una declaración sin error de tipo. No ve el objeto declarado en el archivo de inclusión protected CSomeClass *object. El archivo de inclusión tiene la directiva #include "SomeClass.mqh". Y en el archivo principal se crea un objeto de la clase del archivo incluido y se llama a uno de los métodos.