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

 
trader781:

Entonces, por favor, responda a mi pregunta anterior

1) Escribir una matriz de estructuras

2) Transferencia a otras funciones

3) Recuperación y comparación de elementos de una matriz de estructuras

4) imprimir un conjunto de estructuras

Es importante que lo escriba en forma de código para que entienda cómo debe ser.

Todo depende de la tarea a realizar. Dado que las tareas pueden ser tan diferentes como se quiera, ¿qué debe mostrarse?

Bueno, lo escribo, pierdo el tiempo y lo que he escrito me cuadra. Y el agujero es triangular. ¿Y dónde pongo el cuadrado entonces?

 
Artyom Trishkin:

Todo depende de la tarea a realizar. Dado que las tareas pueden ser tan variadas como se quiera, ¿qué debe mostrarse?

Bueno, lo escribiré, perderé mi tiempo, pero lo que he escrito está cuadrado. Y el agujero es triangular. ¿Y dónde pongo el cuadrado entonces?

tomemos el puesto 699 y sobre

cómo pasar esto a otras funciones y comparar un elemento de la estructura con el anterior

para que pueda tomar cualquier orden en el orden y la salida de todos los valores a la impresión

La diferencia es que no es un número y hay diferentes reglas de registro.

 
trader781:

tomemos el puesto 699 y sobre

cómo pasar esto a otras funciones y comparar el elemento de la estructura con el anterior

y así puedo tomar cualquier orden en orden e imprimir todos los valores

La diferencia es que no es un número y se aplican diferentes reglas de escritura.

Hay que hacer un bucle con todas las órdenes necesarias.

Una vez determinado el siguiente orden necesario, se incrementa el array en 1, y se registran todos los datos de este orden en su nueva celda. La celda de la matriz se rellena con la hora de apertura de la orden (si busca órdenes cerradas, la hora de cierre). El resto de los datos deben escribirse en los campos de la estructura.

Una vez finalizado el bucle, ordena el array en orden ascendente de valores.

Deberías hacer esto primero. El resto se puede discutir más adelante.

 
Vitalie Postolache:

No es un problema que pueda resolverse en un solo ciclo.

Gracias.

 
Artyom Trishkin:
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct myorder
  {
   int               Ticket;
   double            orderopenprice;
   int               ordertype;
   double            profit;
   double            stoploss;
   double            lot;
  };
myorder orders[][5];

int    i;
int    Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CalcOrders();

  }
//+------------------------------------------------------------------+
void CalcOrders()
  {
   int count1=-1;
   ArrayResize(orders,AccountInfoInteger(ACCOUNT_LIMIT_ORDERS),10);
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
        {
         count1++;
         orders[count1][0].Ticket=OrderTicket();
         orders[count1][1].lot=OrderLots();
         orders[count1][2].orderopenprice=OrderOpenPrice();
         orders[count1][3].ordertype=OrderType();
         orders[count1][4].profit=OrderProfit();
         orders[count1][5].stoploss=OrderStopLoss();
        }

     }
   ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);

  }
//+------------------------------------------------------------------+
Archivos adjuntos:
test.mq4  3 kb
 
trader781:

He puesto tu código en tu post.

Ahora bien, si empiezas a resolverlo

  1. ¿Por qué has hecho del array de estructuras un array multidimensional?
  2. ¿Por qué ha cambiado el tamaño de la matriz de la estructura en la función CalcOrders() a"Número máximo permitido de órdenes pendientes"? Si abre la ayuda (lo que debería hacer siempre), verá que este identificador(ACCOUNT_LIMIT_ORDERS) puede devolver cero, lo que significa que no hay límite en el número de órdenes pendientes . El tamaño del array debe ser cero antes del bucle.
  3. ¿Por qué no aumentas el tamaño del array en el bucle?
 
Artyom Trishkin:

He puesto tu código en tu post.

Ahora bien, si empiezas a resolverlo

  1. ¿Por qué has convertido un array de estructuras en un array multidimensional?
  2. ¿Por qué se cambia el tamaño de la matriz de la estructura en la función CalcOrders() a"Número máximo permitido de órdenes pendientes activas"? Si abre la ayuda (lo que debería hacer siempre), verá que este identificador(ACCOUNT_LIMIT_ORDERS) puede devolver cero, lo que significa que no hay límite en el número de órdenes pendientes . El tamaño del array debe ser cero antes del bucle.
  3. ¿Por qué no aumentas el tamaño del array en el bucle?

1) pensó que el número de parámetro X orden Y es más apropiado para la tarea dada

2) Lo tengo igual a 50 o 100 dependiendo del tipo de cuenta, y nada más

3) por lo que sicount1++; aumentará en cada pasada, y el array adquirirá su valor

 
trader781:

1) consideró que el número de parámetros X orden Y es más apropiado para esta tarea

2) es igual a 50 o 100 según el tipo de cuenta, y nada más

3) por lo que sicount1++; aumentará en cada pasada, y el array adquirirá su valor

1. ¿para qué sirve la estructura entonces?

2. Necesitas este parámetro para una serie de posiciones de mercado "que fueron y que se fueron"... El array antes del bucle debe tener un tamaño cero .

3. Así es. El array tiene un tamaño cero al principio. Con cada nuevo pedido encontrado, el array pasa a tener un tamaño igual al número de pedidos que necesita.

 
Artyom Trishkin:

1) ¿Para qué sirve la estructura entonces?

2. Se necesita este parámetro para el conjunto de posiciones de mercado "lo que fue y lo que se fue". El array antes del bucle debe tener un tamaño cero .

3. Así es. El array tiene un tamaño cero al principio. Con cada nuevo pedido encontrado, el array pasa a tener un tamaño igual al número de pedidos que necesita.

1) el compilador se quejará si no se pone la segunda dimensión, "especificar tipo de clase, parámetros desconocidos" aparecerá inmediatamente

2) el bot morirá inmediatamente en el lanzamiento con "error crítico array out of range".

3) establecerint count1=-1; luego pasar por el bucle. ¿Qué pasa aquí?

 
trader781:

1) el compilador se quejará si no se establece la segunda dimensión

2) entonces el bot morirá inmediatamente al arrancar con "error crítico array out of range"

3) simplemente establecerint count1=-1; ¿Qué pasa aquí?

Sólo te dice que una de las dimensiones debe ser eliminada. Estás declarando un array unidimensional y quieres escribirlo en uno bidimensional. ¿Qué obtendrá como resultado? Obtendrá un error del compilador, por supuesto.

2. Tienes que llenar el array correctamente en el bucle, y no sólo darle alguna variable de tamaño aleatorio y luego meter cosas de tamaño aleatorio en él.

3. tú eres el que pone la variable a -1. Y el array debe tener un tamaño cero antes del bucle. ¿Qué no está claro aquí?

Juguemos a un juego de asociación:

  • Imagina que tienes un globo desinflado (matriz vacía) que tiene volumen interno cero (tamaño de la matriz cero). Dentro de este globo (en el array) quieres poner monedas (las órdenes que quieras). Aquí, cada moneda, una vez que decida que es adecuada para ser almacenada en el globo (cada orden deseada encontrada), aumentará el volumen interno del globo (sólo la propia moneda estirará el globo, y tiene que hacerlo usted mismo: aumentar el tamaño del array en 1 y meter una orden en él).
    Al final, cuando encuentres todas las monedas y las introduzcas en la bola, ésta no se desinflará - su volumen interno ha sido estirado por las monedas (al final del ciclo de búsqueda el tamaño de la matriz será igual al número de órdenes necesarias encontradas, ya que aumentaste el tamaño de la matriz en 1 con cada orden necesaria encontrada).

    Ahora imagina que inicialmente pones tus monedas no en una bola, que es de goma y puede cambiar su tamaño, sino en una pequeña hucha que tiene un tamaño limitado (has fijado inicialmente el tamaño de la matriz y no lo has aumentado más). ¿Qué pasará? No todas las monedas caben en la hucha. El globo lo hará.

Aquí hay una asociación para ti.
Razón de la queja: