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

 

1.Tengo una duda, como puedo borrar un elemento de un array a través de la memoria, de momento borro un elemento desplazando el array matemáticamente a través de un bucle, ¿es posible en mql4? Si es posible, por favor, dé un ejemplo de cómo se hace esto en un array unidimensional.

2. Además, ¿qué forma sería más eficaz, teniendo en cuenta: si elimino a través de la memoria, cortar un segmento con elementos innecesarios, la matriz se reducirá y su número disminuirá por el valor de los elementos eliminados, y en el siguiente uso de la matriz, tendremos que restaurar la matriz a su estado original; si elimino a través de un método matemático, el procesamiento del ciclo, que implica cálculos constantes para asignar valores a las variables, lo que a su vez afecta al programa?

 
Seric29:

1.Tengo una duda, como puedo borrar un elemento de un array a través de la memoria, de momento borro un elemento desplazando el array matemáticamente a través de un bucle, ¿es posible en mql4? Si es posible, por favor, dé un ejemplo de cómo se hace esto en un array unidimensional.

2. Además, ¿qué forma será más eficaz, teniendo en cuenta que si se elimina a través de la memoria, recortar una matriz con elementos innecesarios, la matriz se reducirá y su número disminuirá por el valor de los elementos eliminados, y en el siguiente uso de una matriz, tendremos que restaurar la matriz a su estado original; si se elimina a través de un método matemático, el procesamiento del ciclo, que implica cálculos constantes para asignar valores a las variables, que a su vez afecta al programa?

Simplemente copie el array "en sí mismo" y reduzca el tamaño del array en el número de elementos que no necesita.

Para insertar un solo elemento, basta con aumentar el tamaño, copiar de nuevo "a sí mismo" y pegar el valor deseado en el espacio libre.

 
Alexey Viktorov:

Basta con copiar la matriz "en sí misma" y reducir el tamaño de la matriz en el número de elementos innecesarios.

Para insertar un solo elemento, basta con aumentar el tamaño, copiar de nuevo "a sí mismo" y pegar el valor deseado en el espacio libre.

He intentado insertar un array de 3 dimensiones en la función de copia, no hay errores, por lo que esta función puede trabajar con arrays de diferentes dimensiones o simplemente tiene duplicados para diferentes dimensiones. Resulta que esta función se puede utilizar en lugar de una función de desplazamiento, no hace falta escribir una propia, ojalá se me hubiera ocurrido antes, lo arriesgado que es copiar un array a sí mismo, está escrito que el resultado puede no estar definido.

 
Seric29:

He intentado insertar un array de 3 dimensiones en la función de copia, sin errores, por lo que esta función puede trabajar con arrays de diferentes dimensiones o simplemente tiene duplicados para diferentes dimensiones. Resulta que esta función se puede utilizar en lugar de una función de desplazamiento, no hace falta escribir una propia, ojalá se me hubiera ocurrido antes, lo arriesgado que es copiar un array a sí mismo, está escrito que el resultado puede no estar definido.

Al copiar una matriz multidimensional, hay que tener en cuenta la dimensionalidad de la segunda dimensión y de las siguientes. Esto determina cuánto hay que desplazar al copiar. Sencillamente, según entendí en mis experimentos, todos los valores del array multidimensional se alinean en "una fila" y luego se vuelven a alinear en "columna por..."

En definitiva, ahora no puedo contar la teoría. Tendré que comprobarlo de nuevo, si necesito utilizarlo.

 
Alexey Viktorov:

Al copiar una matriz multidimensional, hay que tener en cuenta la dimensionalidad de la segunda dimensión y de las siguientes. Esto determina la cantidad de desplazamiento que se necesita al copiar. Sencillamente, según entendí en mis experimentos, todos los valores de un array multidimensional se alinean en "una fila" y luego se vuelven a alinear en "columna por...".

En general, ahora no puedo contar la teoría. De nuevo habrá que comprobar si es necesario utilizarlo.

En C++, no hay diferencia entre este

   вывести в консоль massiv[0][0][0]
   или так
   вывести в консоль massiv[0]

en cualquiera de estos casos habrá una salida. Porque están en un solo bloque de memoria y C++ accede a ellos directamente, mientras que en nuestro shell el acceso a la memoria es cerrado y no hay forma de pasar correctamente arrays de distinta dimensión a una función, ni de direccionarlos de esta manera, el único matiz es que los arrays multidimensionales en C++ están dispuestos en memoria dinámica, quizás incluso dispersos, aunque nadie ha visto el mapa electrónico. Entonces, ¿copiar arrays multidimensionales por el concepto en sí mismo es una cuestión muy sutil o puede no funcionar correctamente?

 
¿Cómo puedo determinar mediante programación si he entrado en mi cuenta con mi contraseña de inversión o con mi contraseña de negociación?
 

Tengo un código que no se ejecuta en MQL5 en mi indicador

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

El caso es que siel precio == STO_LOWHIGH todo funciona correctamente, pero siel precio == STO_CLOSECLOSE la función asigna a las variables estáticas solamente

vhigh = 0; vlow = High[i];

... evitar el bucle

 
Alexandr Sokolov:

Tengo un código que no se ejecuta en MQL5 en mi indicador

La cuestión es que siel precio == STO_LOWHIGH todo funciona correctamente, pero si el precio == STO_CLOSECLOSE la función sólo asigna a las variables estáticas

... evitar el bucle

Algo no funciona con los paréntesis. En mi opinión, no son necesarios en absoluto. Ninguno de ellos es necesario en absoluto.

O, al menos, desplazar los resaltados antes del signo de interrogación hacia la izquierda.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH ? High[a] : Close[a]) > vhigh ? (price == STO_LOWHIGH ? High[a] : Close[a]) : vhigh);
      vlow  = ((price == STO_LOWHIGH ? Low[a] : Close[a]) < vlow ? (price == STO_LOWHIGH ? Low[a] : Close[a]) : vlow);
     };
  }

En general, sólo hay que entender que el operador ?: es equivalente a if else

Tienes una condición dos veces. Una condición como esta sería suficiente

vhigh = price == STO_LOWHIGH ? High[a] : Close[a];
vlow  = price == STO_LOWHIGH ? Low[a] : Close[a];
O no entiendo a qué querías llegar.
 
Alexey Viktorov:

Hay algo que falla en los soportes. En mi opinión, no son necesarios aquí en absoluto. Ninguno de ellos lo es.

O, al menos, mover los resaltados a la izquierda antes del signo de interrogación.

En general, sólo hay que entender que el operador ?: es equivalente a if else

Tienes una condición dos veces. Esta condición sería suficiente.

O no entiendo a qué querías llegar.

Quiero obtener los estocásticos normales maxHigh y minLow dentro del periodo K por Low/High y Close/Close

Baja/Alta durante la inicialización funciona bien, pero Cerrar/Cerrar no

 
Alexey Viktorov:

Hay algo que falla en los soportes. En mi opinión, no son necesarios aquí en absoluto. Ninguno de ellos lo es.

O, al menos, mover los resaltados a la izquierda antes del signo de interrogación.

En general, sólo hay que entender que el operador ?: es equivalente a if else

Tienes una condición dos veces. Esta condición es suficiente.

O no entiendo a qué querías llegar.

No lo entendí de inmediato, pero si te refieres a esto.

void KValues(int i)
  {
   vhigh = 0; vlow = High[i];
   int limit = i + (int)kperiod;
   for(int a = i; a < limit; a++)
     {
      vhigh = ((price == STO_LOWHIGH) ? High[a] : Close[a] > vhigh ? (price == STO_LOWHIGH) ? High[a] : Close[a] : vhigh);
      vlow  = ((price == STO_LOWHIGH) ? Low[a] : Close[a] < vlow ? (price == STO_LOWHIGH) ? Low[a] : Close[a] : vlow);
     };
  }

no resuelve mi problema.

Razón de la queja: