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

 

¿Has probado a hacer las variables globales?

int izmb=0, izms=0;

void OnTick()
   {
   double LB=0,LS=0;
   int b=0,s=0;
   
   for(int i=0; i<OrdersTotal(); i++)
      {    
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         { 
         if(OrderSymbol()==Symbol())
            { 
            if(OrderType()==OP_BUY)             
               {  
               LB+=OrderLots();
               b++; 
               }                                         
            else if(OrderType()==OP_SELL)        
               {
               LS+=OrderLots();
               s++;
               } 
            }
         }     
      }
   if(izmb!=b || izms!=s)
      { 
      izmb=b;
      izms=s 
           // далее идут условия для открытия ордера.
      }
 
scomoroh:

Queríamos comprobar las condiciones para encontrar una entrada del EA no cada tick, sino sólo cuando otra orden es abierta o cerrada por otro EA o manualmente (para que el procesador no se sobrecargue). Por eso hay que comprobar si el número de órdenes corresponde a cada tick.

¿Podemos utilizar una variable estática ? ¿Funcionará el programa de esta forma?

Alternativamente, la condición más simple y fácil

OnTrade() es un análogo para mt4 con mt5

void OnTrade()
 {
  ... // сюда код, который будет работать только по изменению ситуации по счёту: открытие/закрытие позиций, установка/удаление ордеров
 }

static _OTotal = -1;
static _HTotal = -1;
int OT=OrdersTotal();
int HT=OrdersHistoryTotal();
  if(OT!=_OTotal || HT!=_HTotal) // если изменилось - выполняем
   {
     OnTrade(); // здесь дёргаем текущую ситуацию на счёте и заполняем структуры
     _OTotal=OrdersTotal(); // запомним текущее количество
     _HTotal=OrdersHistoryTotal(); // запомним количество в истории
   }
 
ANDREY:

Gracias por su respuesta. He entendido todo lo que has escrito. Pero no entendí el significado de lo que escribiste en términos de mi problema.

Por matriz bidimensional horizontal en mi código me refiero a cuando hay 2 filas bajo índice 0 o 1 y columnas bajo índices de 0 a 30. La primera dimensión se denota como[0][0],[0][1],[0][2], ...[0][30] La segunda dimensión se denota como[1][0],[1][1],[1][2], ...[1][30]

Por matriz bidimensional vertical en mi código me refiero a cuando hay 31 filas indexadas de 0 a 30 y 2 columnas indexadas 0 y 1. La primera dimensión se denota como[0][0],[1[0],[2][0], ...[30][0] La segunda dimensión se denota como[0][1],[1][1],[2][1], ...[30][1]

Si ejecuta mi código, el array se llenará verticalmente. Y la función ArraySort() ordenará el array como es debido.

PREGUNTA ¿Por qué no funciona la función ArrayFill() en este caso ? Al fin y al cabo, le pedí que llenara la primera dimensión del array (31 elementos) con los mismos valores 0,5555.
Gracias por la ayuda.

MQL4 puede trabajar con arrays de no más de 4 dimensiones. Por lo tanto, arr[31][31] es un error. Un array no puede ser mayor que arr[][4]. Y la primera dimensión está limitada no por MQL, sino por no sé qué. Tal vez alguien pueda explicarlo.

La función ArrayFill() funcionará, pero tenemos que entender que el número de elementos del array arr[3][2] será 6, y tenemos que escribir 6 en esta función, no 3 por el tamaño de la primera dimensión.

 

Dimensión cuatridimensional: arr[][][] o arr[,,].

Las dimensiones de las tres últimas dimensiones deben especificarse en la declaración y ser fijas. La primera dimensión puede dejarse sin especificar y modificarse posteriormente:

int arr[,100,200,500];

En el ejemplo de una matriz bidimensional, los datos de la matriz están dispuestos de la siguiente manera:

int arr[2,5]={0,1,2,3,4,  - в нулевом элементе первого измерения 
              5,6,7,8,9}; - в первом элементе первого измерения

Ordenar mueve toda la horizontalidad ordenando por la primera dimensión,

y ArrayFill() rellena de un elemento a otro, por ejemplo de 3 a 8. Esto da lugar a un desorden.

Si quiere rellenar algunos valores en la horizontal por la primera dimensión, debe controlar el inicio y el final del relleno, sabiendo cómo están dispuestos los datos.

Por ejemplo, toda la regla del elemento cero de la primera dimensión:

int value=5;
int index=0;
ArrayFill(arr, index*ArrayRange(arr,1), ArrayRange(arr,1), value); 

Si sólo hay un elemento cero, entonces sí:

ArrayFill(arr, index*ArrayRange(arr,1), 1, value); 

Si muchos elementos cero, entonces por bucle y asignación simple.


No debo haberlo explicado muy claramente... Utiliza la impresora, imprime todo en el bucle, por aquí y por allá, y le cogerás el tranquillo. Así aprenderás más rápido.

¡printf es mi amigo!

 
Alexey Viktorov:

MQL4 no puede manejar más que matrices de 4 dimensiones. Por lo tanto, arr[31][31] es un error. Un array no puede ser mayor que arr[][4]. Y la primera dimensión está limitada no por MQL, sino por qué, no sé exactamente. Tal vez alguien pueda explicarlo.


¿Y la primera dimensión (es decir, el número de cadenas) está limitada por cuántas? ¿Qué número de filas en un array multidimensional permite MQL4?

 

Creo que las cuatro dimensiones tienen un límite:INT_MAX

Sobre la estructura.

bidimensional:

Por estructura representa una matriz unidimensional en la que los elementos están dispuestos de la siguiente manera: primero la primera fila, luego la segunda y después la tercera.

tridimensional:

En tres dimensiones, también. Se trata de una matriz unidimensional, en la que las primeras filas van una detrás de otra, y luego las segundas,.....

¿Por qué unidimensional? Porque en la memoria del ordenador se asignan varias celdas en una fila para la matriz, por lo que se escribe todo en ellas en orden: fila00+fila01+fila02+fila10+fila11....


Y también es posible añadir una cuarta dimensión: pilas de hojas de matriz tridimensionales.

Sólo se puede modificar el número de filas en el transcurso del programa. Todas las filas, columnas, hojas y pilas son sólo una convención para entender la estructura. Las dimensiones no están realmente en nuestro espacio, son sólo medidas.

Como dice Alexei:

Alexey Viktorov:

... columna ... es ... horizontal porque lo estoy mirando acostado en el sofá.........

 
Alexey Viktorov:

¿Se ha dado cuenta dela siguiente nota

ArrayFill

Los arraysmultidimensionales cuando se procesan con ArrayFill()aparecen como unidimensionales, por ejemplo, array[2][4] se procesa como array[8], por lo que cuando se trabaja con este array es aceptable especificar el índice del elemento inicial igual a 5. Por lo tanto, llamar a ArrayFill(array, 5, 2, 3.14) para array[2][4] llenará los elementos de array[1][1] y array[1][2] con el valor 3.14.


Lo tengo todo resuelto excepto ArrayFill().

1. Cuando declaro un array double LoY[31][31]; esencialmente estoy creando una tabla de 31 filas por 31 columnas. He creado una matriz bidimensional (en lugar de cuatridimensional), pero aún no la he llenado.

2. A continuación en el código relleno cada elemento individual del array con un valor Bid. Puedo rellenarlo con 2 opciones
a) LoY[31][0]=Bid; - Relleno la fila 31 y la primera columna del array con valores Bid. Y la segunda dimensión (columna bajo el índice 1, se rellena con 0 por defecto, porque no la relleno. Así que en esta variante tengola primera dimensión con 31 elementos llenos y la segunda dimensión con 1.

b) LoY[0][31]=Bid - Lleno la columna 31 y la primera fila de la matriz con valores de Bid. Y la segunda dimensión (línea bajo el índice 1, se rellena con 0 por defecto, porque no la relleno. Así, en esta variante, la segunda dimensión consta de 31 elementos rellenos, la segunda dimensión consta de 1.

ArraySort() ordena la matriz bidimensional sólo por la primera dimensión. Por lo tanto, clasificará la opción a) en la que la primera dimensión tiene 31 filas y no ordenará la opción b), en la que la primera dimensión tiene sólo 1 fila, porque 1 fila no puede ser ordenada.
AhoraArrayFill( ) Pone la matriz bidimensional en una sola línea antes de asignar los valores requeridos a los elementos de la matriz bidimensional. Es decir, tendrá que sacar mi array LoY[31][31] en una sola línea de tamaño 961 elementos. Es una cadena muy larga y la mayoría de los elementos serán innecesarios.

Así que hagamos un array LoY[31][2] ( variante a))o LoY[2][31] (variante b))

Está claro cómoArrayFill() dibujará en 1 línea en la variante b) . La segunda línea simplemente se unirá a la primera y después del último elemento de la primera línea LoY[0][31] la primera línea de la matriz en ArrayFill() continuará conLoY[0][32] y terminará conLoY[0][62] Y los valores de los elementos del array en ArrayFill() irán en el siguiente orden desde el índice 0 hasta el 31 los elementos del array se llenarán con valores de precio y desde el índice 32 hasta el final se llenarán con 0 .

PREGUNTA: ¿Cómo dibujaArrayFill() la opción a) en 1 línea? Después de todo, hay 28 filas en esta variante. Y si será una línea, ¿en qué orden contendrá los valores de los elementos del array? Y, ¿puedo utilizar Print() para imprimir los elementos de mi matriz bidimensional después de que ArrayFill() los convierta en una matriz unidimensional? Esta función en sí no devuelve ningún valor, por lo que Print() no lo imprime si se introduce en ella.

Gracias por la ayuda.

 

He metido la pata un poco aquí... Estoy avergonzado de mí mismo.

elemento individual del array con un valor Bid. Puedo rellenarlo con 2 opciones
a) LoY[31][0]=Bid; - Relleno la fila 31 y la primera columna del array con valores Bid. Y la segunda dimensión (columna bajo el índice 1, se rellena con 0 por defecto, porque no la relleno. Así que en esta variante tengola primera dimensión con 31 elementos llenos y la segunda dimensión con 1.

b) LoY[0][31]=Bid - Lleno la columna 31 y la primera fila de la matriz con valores de Bid. Y la segunda dimensión (línea bajo el índice 1, se rellena con 0 por defecto, porque no la relleno. Así, en esta variante, la segunda dimensión consta de 31 elementos rellenos, la segunda dimensión consta de 1.

ArraySort() ordena la matriz bidimensional sólo por la primera dimensión. Por lo tanto, clasificará la opción a) en la que la primera dimensión tiene 31 filas y no ordenará la opción b), en la que la primera dimensión tiene sólo 1 fila, porque 1 fila no puede ser ordenada.
AhoraArrayFill( ) Pone la matriz bidimensional en una sola línea antes de asignar los valores requeridos a los elementos de la matriz bidimensional. Es decir, tendrá que sacar mi array LoY[31][31] en una sola línea de tamaño 961 elementos. Es una cadena muy larga y la mayoría de los elementos serán innecesarios.

Así que hagamos un array LoY[31][2] ( variante a))o LoY[2][31] (variante b))

Está claro cómoArrayFill() dibujará en 1 línea en la variante b) . La segunda línea simplemente se unirá a la primera y después del último elemento de la primera línea LoY[0][31] la primera línea de la matriz en ArrayFill() continuará conLoY[0][32] y terminará conLoY[0][62] Y los valores de los elementos del array en ArrayFill() irán en el siguiente orden desde el índice 0 hasta el 31 los elementos del array se llenarán con valores de precio y desde el índice 32 hasta el final se llenarán con 0 .

PREGUNTA: ¿Cómo dibujaArrayFill() la opción a) en 1 línea? Después de todo, hay 28 filas en esta variante. Y si será una línea, ¿en qué orden contendrá los valores de los elementos del array? Y, ¿puedo utilizar Print() para imprimir los elementos de mi matriz bidimensional después de que ArrayFill() los convierta en una matriz unidimensional? Esta función en sí no devuelve ningún valor, por lo que Print() no lo imprime si se introduce en ella.

Gracias por su ayuda.

Me cuesta entenderte. Tal vez esta sea la razón por la que no puedo entenderlo bien. Repite la pregunta con la matriz LoY[5][3], es decir, 5 líneas y 3 columnas.

ArrayFill no convierte el array inicial de ninguna manera. Sólo procesa el array como si fuera un array unidimensional. La función realiza las acciones necesarias en el array y retrocede sin afectar a la dimensionalidad.

Según la documentación, la funciónArrayFill(LoY, 3, 6, 12) rellenará sólo las filas con índice 1 y 2 en el array LoY con valor 12.

LoY[1][0] se llenará con 12.

LoY[1][1] tendrá el valor 12.

LoY[1][2] tendrá el valor 12.

LoY[2][0] tendrá el valor 12.

LoY[2][1] tendrá el valor 12 .

LoY[2][2] se ajustará a 12 .

Todos los demás quedarán sin tocar.

Experimenta con una matriz pequeña y con números que sean fáciles de entender. Por ejemplo, el 12 y el 8 se notará fácilmente cuál es más grande. Y 1.123654 y 1.123583 es más complicado

 
Alexey Viktorov:

ArrayFill no convierte la matriz original de ninguna manera. Sólo procesa el array como si fuera un array unidimensional. La función realizó las acciones necesarias en el array y lo volcó sin alterar la dimensionalidad.


Esto redujo en gran medida mis malentendidos y aumentó mi comprensión. Ahora volveré a analizar todo lo que escribí teniendo en cuenta la circunstancia recién descubierta....

 
Alexey Viktorov:


Según la documentación, la funciónArrayFill(LoY, 3, 6, 12) sólo rellenará las filas con índice 1 y 2 en el array LoY con el valor 12.

LoY[1][0] tendrá un valor de 12.

LoY[1][1] tendrá el valor 12.

LoY[1][2] tendrá el valor 12.

LoY[2][0] tendrá el valor 12.

LoY[2][1] tendrá un valor de 12 .

LoY[2][2] se ajustará a 12 .


PREGUNTA
¿Cómo y qué valores debo introducir enArrayFill() si necesito rellenar los elementos amarillos del mismo array con el valor 12?

OPCIÓN N 1

OPCIÓN N 2


Gracias por su ayuda.
Razón de la queja: