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

 
Dmitry Ivanushko #:
ArrayMaximum
ArrayMaximum

Devuelve índice del valor máximo, no del precio.

//+------------------------------------------------------------------+
int indexMax[];
int indexMin[];
int sizeArray = ArraySize(opens);
int size = 0;
int n = 30;

for(int i = n; i < sizeArray; i + n)
  {
   ArrayResize(indexMax, size + 1);
   indexMax[size] = ArrayMaximum(opens, i - n, i);
   indexMin[size] = ArrayMinimum(opens, i - n, i);
   size++;
  }
//+------------------------------------------------------------------+

No lo he comprobado, pero parece que es la forma de obtener índices de mínimos y máximos de aperturas de velas (opens).

Aunque también se puede obtener el precio a la vez, pero no los índices.

double PriseMin = opens[ArrayMinimum(opens, i - n, i)];
 
for(int i = n; i < sizeArray; i + n)

En ninguna parte he encontrado un ejemplo de un bucle mql con un paso. Esto simplifica todo el asunto.

Sólo ChatGPT me aconsejó escribirlo de esta manera:

for(int i = n; i < sizeArray; i += n)

Voy a experimentar más. El código funciona. Gracias.

El error "array out of range" ocurre si no haces ArrayResize.

 
Dmitry Ivanushko #:

Este error se debe a una falta de atención. Arreglarlo no resuelve el problema.

¿Cómo podría crear un array de 30 precios de apertura de velas para buscar máximos y mínimos en él?

¿Cuál es el problema? Declara un array temp[] y copia 30 elementos en él y busca el índice del valor mínimo/máximo. Y si al final es menos de 30, copiará cuantos quedan. Y en este caso, prefiero usar un bucle while().

 
Alexey Viktorov #:
¿Cuál es el problema? Declara un array temp[] y copia 30 elementos en él y busca el índice del valor mínimo/máximo. Y si al final es menos de 30, copiará cuantos quedan. Y en este caso, prefiero usar un bucle while().

Sí, se puede hacer eso. No estoy pensando bien, por eso pido consejo.

 
Dmitry Ivanushko #:

Sí, podrías hacerlo. No estoy pensando con claridad, así que estoy pidiendo consejo.

En un array estático el tamaño se establece constante, no se puede cambiar, en un array dinámico se puede cambiar, ¡pero el tamaño del array se establece! es decir, se conoce el tamaño del array y los índices de los elementos desde 0 hasta el final. <= está fuera de límites sólo porque los índices de los elementos desde cero, y el índice del último elemento es menor en una unidad del tamaño del array.

Todo está en tus manos))))

 
Valeriy Yastremskiy #:

En un array estático el tamaño se establece constante y no se puede cambiar, en un array dinámico se puede cambiar, ¡pero el tamaño del array se establece! es decir, se conoce el tamaño del array y los índices de los elementos son desde 0 hasta el final. <= está fuera de los límites sólo porque los índices de los elementos a partir de cero, y el índice del último elemento es menor en una unidad del tamaño de la matriz.

Todo está en tus manos))))

¿Qué quieres decir coneso ? ¿Crees que para copiar algún número de elementos de un array a otro, algún temp[], deberías establecer el tamaño del array antes de copiar ArrayResize(temp, new_size); ?????

 
Dmitry Ivanushko #:

Sí, podrías hacerlo. No estoy pensando con claridad, así que estoy pidiendo consejo.

Ni siquiera necesitas un array temporal.

int  ArrayMaximum( 
   const void&   array[],             // массив для поиска 
   int           start=0,             // с какого индекса начинаем поиск 
   int           count=WHOLE_ARRAY    // количество проверяемых 
   );

Este código

  double open[];
  int copy = CopyOpen(_Symbol, PERIOD_CURRENT, 0, 100, open);
  int arrMaximum = ArrayMaximum(open, 85, 20);

busca el máximo de 15 elementos restantes a pesar de que está configurado para buscar 20 elementos.

Así que mejor usa el bucle while() y no te preocupes por el número de elementos restantes del array.

 
Alexey Viktorov #:

¿Qué quieres decir conesto ? ¿Crees que para copiar un cierto número de elementos de un array a otro, algún temp[], deberías establecer el tamaño del array antes de copiar ArrayResize(temp, new_size); ?????

No claro, me refería a que el tamaño del array siempre se conoce o se puede conocer. Y se puede y se debe controlar que no se sobrepase el índice.

 
Valeriy Yastremskiy #:

Por supuesto que no, me refería a que el tamaño del array siempre se conoce o se puede conocer. Y puede y debe ser controlado para el desbordamiento de índice.

Se puede controlar, pero no siempre es necesario...

 
Alexey Viktorov #:

Controlar es posible, pero no siempre necesario....

Jeje, entonces empieza después de sobrepasar los límites))))
Razón de la queja: