Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 263

 
evillive:

int Mas[];


entonces rellena el bucle, si es necesario, utiliza

ArrayResize(Mas,size);

ArrayInitialize(Mas,0);

"luego rellenar el ciclo".
Si no es mucha molestia, un pequeño ejemplo, por favor.
 
Leo59:
"then loop fill"
Si no es mucha molestia, un pequeño ejemplo, ¿puedo?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
 double min,max;
 int start(){
    for(int i=0; i<20; i++)
      MACDBuffer[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i);
    min=ArrayMinimum(MACDBuffer);
    max=ArrayMaximum(MACDBuffer);
    Print(min,"____",max);
 }

Te han dicho que para llenar un array dinámico MACDBuffer[], debes hacerlo estático con ArrayResize() (de lo contrario el resultado de la asignación siempre será un cero),

y, para asegurar la estabilidad de la adecuación de los cálculos, es mejor inicializar el array con ArrayInitialize().

 
ALXIMIKS:


Te han dicho que para llenar un array dinámico MACDBuffer[], debes hacerlo estático con ArrayResize() (de lo contrario siempre devolverá ceros como resultado de la asignación),

y además, para asegurar la estabilidad en la adecuación de los cálculos, es mejor inicializar el array con ArrayInitialize().


Gracias.
El asunto es que hay un Asesor Experto que funciona.
int CD=0; /número de orden de una operación cerrada
double Balance=0; // resultado de una operación cerrada
double Mas[]; // matriz de valores para los resultados de una operación cerrada


¿Cómo llenar Mas[] con los resultados de las transacciones cerradas en int Start()?

¿Quizás haya que escribir algo en init() y deinit()? ¿Un inicializador o algo más?
¿Cómo sería el código correcto?

 
Leo59:
La esencia del asunto es que hay un Asesor Experto en funcionamiento.
int CD=0; // número secuencial de una operación cerrada
double Balance=0; // resultado de una operación cerrada
double Mas[]; // matriz de valores para los resultados de una operación cerrada


¿Cómo en int Start() se rellena Mas[] con los resultados de las operaciones cerradas?

¿Quizás tenga que añadir algo en init() y deinit()? ¿Un inicializador o algo más?
¿Cómo sería el código correcto?

Cada uno tiene una noción diferente de "derecho".

¿Quizás quieres que Mas[CD]=Saldo en la inicialización y que se asigne a Mas[CD]=Saldo al inicio cuando cambies el valor de CD?

O tal vez quiera tener una matriz bidimensional en la que se almacenen todos los datos necesarios (saldo, tiempo, puntos, valores máximos, valores mínimos ....) para cada operación.

 
ALXIMIKS:


Te han dicho que para llenar un array dinámico MACDBuffer[], debes hacerlo estático con ArrayResize() (de lo contrario el resultado de la asignación siempre será un cero),

y además, para asegurar la estabilidad en la adecuación de los cálculos, es mejor inicializar el array con ArrayInitialize().

ArrayResize() cambia el tamaño del array. En mql4 todos los arrays son estáticos por defecto.
 
artmedia70:
ArrayResize() cambia el tamaño del array. En mql4 todas las matrices son estáticas por defecto.

Me equivoqué. El tutorial lo confirma:

Si no se especifica el tamaño de un array unidimensional a inicializar, lo determina el compilador, basándose en el tamaño de la secuencia de inicialización. La inicialización de los arrays también puede realizarse mediante la función estándar ArrayInitialize(). Todas las matrices son estáticas, es decir, tienen una forma estática, incluso si no se especifica explícitamente durante la inicialización. Significa que todos los elementos de la matriz mantienen sus valores en el intervalo entre las llamadas de la función, en la que se declara la matriz.

Pero, ¿por qué entonces un array tan "estático" no asigna valores? El resultado es nulo como se esperaba debido al ArrayResize(buffer,0) del compilador?

int start(){
   double buffer[];
   for(int i=10;i>=0;i--){
      buffer[i]=i;
      Print ("buffer[i]=",buffer[i]);
   }
}
 
ALXIMIKS:

Me equivoqué. El libro de texto lo confirma:

Pero entonces, ¿por qué un array tan "estático" no asigna valores? El resultado es nulo como se esperaba debido a ArrayResize(buffer,0) del compilador?

Porque la matriz es dinámica. Su tamaño en la primera dimensión puede verse con ArraySize() - para una matriz unidimensional, y ArrayRange() - para una dimensión especificada de una matriz multidimensional.

Estático no significa "tamaño por defecto". No confunda los dos conceptos "estático" y "dinámico". No son antónimos. Aquí se trata de diferentes campos de aplicación. Analogía: Un array estático es una "variable estática". Un array dinámico es "un tamaño que se puede establecer y modificar mediante programación".

int start(){
   double buffer[];
   for(int i=0;i<10;i++){
      ArrayResize(buffer,i+1);
      buffer[i]=i;
      Print ("Размер массива = "+(string)ArraySize(buffer)+", Значение в buffer["+(string)i+"] = ",buffer[i]);
   }
   return(0);
}
 
Leo59:

Gracias.
El asunto es que hay un Asesor Experto que funciona.
int CD=0; // número ordinal de una operación cerrada
double Balance=0; // resultado de una operación cerrada
double Mas[]; // matriz de valores de resultados de operaciones cerradas


¿Cómo llenar Mas[] con los resultados de las transacciones cerradas en int Start()?

¿Quizás haya que escribir algo en init() y deinit()? ¿Un inicializador o algo más?
¿Cómo sería el código correcto?

Todos los resultados de las operaciones cerradas pueden verse en el historial de la cuenta. Con el software. Pero, ¿es necesario atiborrar la matriz con ellos todo el tiempo? Puede haber muchos. Es mejor limitar la profundidad necesaria de la historia y llenar la matriz, si realmente no puede vivir sin ella.
 
Chicos, ¿alguien sabe cómo añadir niveles auxiliares a RSI en android?
 
ALXIMIKS:

Me equivoqué. El libro de texto lo confirma:

Pero entonces, ¿por qué un array tan "estático" no asigna valores? El resultado es nulo como se esperaba debido a ArrayResize(buffer,0) del compilador?


Porque no es una matriz, para ser precisos. Si quiere más detalles - vea la descripción del lenguaje C. Me refiero a él porque desde el principio los desarrolladores dijeron que todo lo que no está claro o se explica de forma incompleta - vea el estándar C.

Cuando se declara la variable double buffer[]; entonces se asigna memoria para una variable, que en términos de C se llama "puntero", tiene tipo entero y almacena la dirección de la celda de memoria donde comienza el array. Si se comprueba la dimensionalidad de la variable en MCL, se obtiene el valor 0. Esto significa que el array en sí no tiene memoria asignada y cuando intentas asignar un valor, no hay dónde escribirlo: en la ACM no hay aritmética de direcciones y no se pueden manejar punteros. En C se puede escribir, pero con la memoria "no asignada" suele provocar un fallo del sistema. Cuando se aplica AreiResize(array,N), (N>0), esto asigna memoria para el array (al menos un elemento) y crea espacio para escribir valores. Entonces, cuando se compruebe, la dimensión del array será diferente de 0.

El concepto de matriz estática en términos de C tiene varios significados:

1. Un array estático (así como una variable/tipo estático) son aquellas variables/arreglos cuya dimensionalidad se conoce en la fase de compilación (precompilación para MKL4) . Por ejemplo, cuando se describe double buff[10000];, el compilador recibe el tamaño de la variable y puede asignar memoria inmediatamente. En contraposición a este concepto, existe el de "matriz dinámica", es decir, una matriz cuyo tamaño se desconoce en tiempo de compilación y sólo se conoce en tiempo de ejecución; todas ellas son matrices de tamaño variable. Cuando se accede a estas matrices, hay que asignar previamente la memoria. La memoria se asigna fuera de la memoria estática del programa.

En C/C++, si un array se describe en un bloque, su visibilidad está limitada por el bloque, ya sea un array estático o dinámico. Los errores en los programas, como las "fugas de memoria", se asocian a las matrices dinámicas definidas localmente, es decir, cuando un puntero de memoria se destruye porque sale del área de visibilidad, pero la memoria asignada a él sigue ocupada.

2 El concepto de matriz "estática" como una variable descrita con el modificador static - tales variables no se destruyen al salir del ámbito del bloque - se encuentran en un área de memoria separada - por lo tanto los valores en ellos se conservan. Se reduce el riesgo de fugas de memoria. Una matriz declarada como dinámica en el sentido de p.1 (es decir, el tamaño de la matriz no se conoce en la fase de compilación), también puede ser estática en el sentido de p.2, es decir, declarada con el modificador "static".

Al terminar los programas, la memoria asignada dinámicamente debe ser liberada para evitar fugas de memoria. No sé si los desarrolladores de MKL siguen esto, pero en mis programas siempre libero memoria - costumbre de C - ArreyResize(array,0);

En MKL todas las matrices son estáticas en el sentido del punto 2.

Ahora, con respecto a su pregunta: "¿Por qué no se puedenasignar valores a un array estático double buffer[]; ? Porque no se le asigna memoria (de hecho, es un array dinámico con un modificador estático). Antes de asignar los valores, se debe asignar memoria, es decir, se debe aplicar ArrayResize con un tamaño superior a 0 a este array. En el caso de las matrices, es necesario controlar el rebasamiento de la memoria (fuera de la matriz).

SZ Espero haber sido claro. He intentado mantenerlo lo más sencillo posible.