Preguntas de un "tonto" - página 62

 
x100intraday:
Un ejemplo sería...

Así (no la estructura, sino la clase, por supuesto):

class TBuffer
{
public:
  double  MABuffer[ ];
};

//---------------------------------------------------------------------
TBuffer*  Buffer_Array[ ];
//---------------------------------------------------------------------

//---------------------------------------------------------------------
  ArrayResize( Buffer_Array, NUMBER );
  for( int i = 0; i < NUMBER; i++ )
  {
    Buffer_Array[ i ] = new TBuffer;
    SetIndexBuffer( i, Buffer_Array[ i ].MABuffer, INDICATOR_DATA );
  }

Qué poner dónde, creo que está claro.

No lo olvides al final:

  for( int i = 0; i < NUMBER; i++ )
  {
    delete( Buffer_Array[ i ] );
  }
 
Yedelkin:

Permítanme decirlo de otra manera. Se pregunta si es posible, al definir una función

especificar sólo una variable del tipo de la estructura como su parámetro formal, ignorando el nombre de la propia estructura? Es decir, ¿especificar, por ejemplo, no void funcName(MqlTradeRequest & req), sino simplemente void funcName(& req)?

Sí. Se necesita una función universal para cualquier estructura simple --- Sin métodos, din. arrays. etc. --- puramente una secuencia de tipos de datos específicos.

Dado que la composición del guión está predeterminada por mí, puedo especificar explícitamente el número de estructuras a tratar.

struct Data1
  {
   double param[1000000];
  };
struct Data2
  {
   int    temp;
   double k;
  };
struct Data3
  {
   int    temp;
   double k;
  };

Pero para pasar cualquiera de estas estructuras a lafunción con un nombre, tengo que usar la sobrecarga.

void funWrite(Data1 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data2 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }
void funWrite(Data3 &dd[])
  {
    .....
    Один тип обработки для всех структур
    .....
    FileWriteArray(1, dd);
  }

Aquí hay algunas dificultades.

1. El número de estructuras es limitado, porque la sobrecarga se ralentizará si tiene más elementos.

2. Yo mismo puedo cometer un error al copiar las funciones de sobrecarga.

PS// La funciónfunWrite() realiza ciertos cálculos y ejecutaFileWriteArray() con una determinada secuencia y parámetros calculados (desde qué índice escribir, cuántos leer).

 
rlx:

Sí. Se necesita una función universal para cualquier estructura simple --- Sin métodos, din. arrays. etc. --- puramente una secuencia de tipos de datos específicos.

Dado que la composición del guión está predeterminada por mí, puedo especificar explícitamente el número de estructuras a tratar.

Pero para pasar cualquiera de estas estructuras a una función con un nombre, tengo que utilizar la sobrecarga.

Ya veo. Hace tiempo hice una pregunta similar sobre si era posible no especificar el tipo de los arrays al definir una función. Justo debajo, Roche aconsejó sobrecargar.

Así que llegué a la conclusión de que las funciones "incorporadas" comoFileWriteArray(), quetienen algunos parámetros especificados con tipo void, son en sí mismas funciones sobrecargadas. Simplemente no vemos su aplicación.

 
Yedelkin:

Ya veo. Una vez hice una pregunta similar sobre si era posible no especificar el tipo de los arrays al definir una función. Justo debajo, Roche aconsejó sobrecargar.

Así que llegué a la conclusión de que las funciones "incorporadas" comoFileWriteArray(), quetienen algunos parámetros especificados con tipo void, son en sí mismas funciones sobrecargadas. Simplemente no podemos ver su aplicación.

Las funciones incorporadas están escritas en un lenguaje de programación completo.

En C, por ejemplo, puedes pasar cualquier número de variables, y ya en la función obtener una lista de parámetros pasados y examinarlos.

void fun(...)
  {
}

En MQL5, no existe esa posibilidad. En particular, faltan enlaces y punteros a tipos de datos y estructuras simples...

 

Debe tener algo que ver con la seguridad. Acceso a los datos. Salir de la caja de arena.

Pero todavía quiero que estas características se implementen en MQL5

 
rlx:

Debe tener algo que ver con la seguridad. Acceso a los datos. Salir de la caja de arena.

Pero todavía me gustaría que estas características se implementaran en MQL5

Sería mejor que escribiera su solicitud al Service Desk. De lo contrario, se perderá rápidamente en el foro.
 
Dima_S:

Así (no la estructura, sino la clase, por supuesto):

Creo que está claro lo que hay que poner donde.

Al final, no lo olvides:

Eso es lo que yo llamo ayuda: real y bastante concreta. Gracias. ¿Dónde está el signo más?

Por cierto... He pensado que eso es suficiente para mí. Pero no quiero ser un formalista... ... así que, por curiosidad, decidí que no estaría de más intentar organizar una matriz bidimensional. MQL me recuerda algo a C/C++, que he olvidado en los últimos doce años. Ahora he intentado hacerlo así (sin bucle - lo he simplificado intencionadamente):

class TBuffer
{
public:
  double MABuffer[][1];
};

//---------------------------------------------------------------------
TBuffer* Buffer_Array[][1];
//---------------------------------------------------------------------
int OnInit()
  {
   ArrayResize(Buffer_Array,1);
   Buffer_Array[0][0] = new TBuffer;
   SetIndexBuffer(0,Buffer_Array[0][0].MABuffer,INDICATOR_DATA);
// --- [...]
   delete(Buffer_Array[0][0]);
   return(0);
  }

El compilador genera el error: "'MABuffer' - la conversión de parámetros no está permitida".

Me pregunto qué estoy haciendo mal. Si no me equivoco, al declarar una clase con un array multidimensional es necesario especificar numéricamente una de las medidas, haciéndola estática...ArrayResize, por su parte, estableceun nuevo tamaño para la primera dimensión.

 

x100intraday:

Me pregunto qué estoy haciendo mal.

1) SetIndexBuffer funciona con una matriz de dobles de la misma dimensión.

2) No está claro por qué se utiliza TBuffer*, es decir, se utiliza la dinámica donde no es necesaria.

3) (TIP) En el ejemplo, se podría haber hecho con una estructura en lugar de una clase, para ahorrar un poco de memoria y un par de cientos de ciclos de reloj.

 

mql5:

3) (TIP) En el ejemplo, se podría haber hecho con una estructura en lugar de una clase, para ahorrar un poco de memoria y un par de cientos de ciclos de reloj.

¿Se ha comprobado esto?
 

El asesor experto utiliza el indicador en un marco temporal diferente. En las pruebas el EA muestra datos incorrectos del indicador.

El propio EA funciona en M5, y el indicador en H4. Los indicadores que se llaman en el mismo marco temporal (M5) devuelven los valores correctos.

Los valores devueltos son similares a los valores del indicador, pero son diferentes de los valores reales que son visibles cuando el indicador se aplica a la ventana del gráfico de precios.

¿Cuál es el problema?

Ejemplo de código de llamada al indicador:

int W_handle;
int OnInit()
  {
   W_handle=iCustom(NULL, PERIOD_H4, "WW");
  }

void OnNewBar() // моя функция
{
 double wave[10];
 ArraySetAsSeries(wave, true);

 CopyBuffer(W_handle,0,0,2,wave);
 if (wave[1] > 0) Buy(); 
// по замыслу в wave[1] должно лежать значение индикатора на предыдущем баре H4
// но так получается только на нескольких первых обращениях, потом результат начинает расходиться с реальностью
}
Способы вызова индикаторов в MQL5
Способы вызова индикаторов в MQL5
  • 2010.03.09
  • KlimMalgin
  • www.mql5.com
C появлением новой версии языка MQL, не только изменился подход к работе с индикаторами, но и появились новые способы создания индикаторов. Кроме того, появилась дополнительная гибкость при работе с индикаторными буферами - теперь вы можете самостоятельно указать нужное направление индексации и получать ровно столько значений индикатора, сколько вам требуется. В этой статье рассмотрены базовые методы вызова индикаторов и получения данных из индикаторных буферов.