Errores, fallos, preguntas - página 1871

 
Slava:
Y no debería ser posible


1. ¿Cuándo está prevista la introducción de la unión?

2. ¿se introducirán también los typedefs?

3. ¿está prevista la introducción de punteros a tipos fundamentales?
 
Konstantin:


1. ¿cuándo está prevista la introducción de la unión?

2. ¿se introducirá también typedef con union?

3. ¿Está prevista la introducción de punteros a tipos fundamentales?

1. Pronto. Todo está listo en el compilador, ahora lo estamos probando. Lo publicaremos después de las pruebas.

2. Todavía no se sabe cuándo

3. no, no está previsto.

 

Por alguna razón,CopyTime (o cualquier otro similar)redimensiona el array de recepción, inclusosi eltamaño del array de recepción es mayor que el tamaño a copiar.

Señores, ¿es normal? ¿Siempre ha sido así? ¿O es un error?

Por ejemplo:

static datetime TimeBuf[]; 

if (ArraySize(TimeBuf) == 0) ArrayResize(TimeBuf, 10);

CopyTime(_Symbol, _Period, 0, 1, TimeBuf);

La función CopyTime redimensiona el array TimeBuf a 1.

En principio, esto es un error.

No sería un problema si no fuera por un matiz importante: los datos se copian al principio de la matriz y, en consecuencia, todo el punto de optimización se pierde en la raíz.

 
Marat Sultanov:

Por alguna razón,CopyTime (o cualquier otro similar)redimensiona el array de recepción, inclusosi eltamaño del array de recepción es mayor que el tamaño a copiar.

Señores, ¿es normal? ¿Siempre ha sido así? ¿O es un error?

Por ejemplo:

La función CopyTime redimensiona el array TimeBuf a 1.

En principio, esto es un error.

No sería tan malo, si no fuera por un matiz importante: los datos se copian al principio de la matriz, y en consecuencia, todo el punto de optimización se pierde en la raíz.

Su conjunto es dinámico. Es decir, con un tamaño variable. Como no ha especificado su dimensión entre corchetes.

La palabra estática significa que el objeto de este array se construye cuando se carga el Asesor Experto, y se destruye cuando se descarga.

 
Slava:

¡Su matriz es dinámica! Es decir, con un tamaño variable. Como no has especificado su dimensión entre corchetes.

La palabra static significa que el objeto de este array se construye al cargar el EA y se destruye al descargarlo

Lo siento, pero no has entendido nada.

Dejemos que la matriz se declare en el ámbito global

datetime _TimeBuf[]; 

void OnTick()
{}

Entonces:

1) La primera vez que copiamos (CopyTime) en el array cuántas barras hay.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      if (_BarsCountReserveSize <= BarsCount) _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
}

2) Según el diseño óptimo, cuando aparece una nueva barra, no queremos copiar todas las barras, ¿verdad? Por lo tanto, decidimos copiar sólo los 2 últimos compases modificados.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
   else
   {
      int RequiredCount = BarsCount - ArraySize(_TimeBuf) + 1;
      
      ArrayResize(_TimeBuf, RequiredCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, RequiredCount, _TimeBuf);
   }
}

3) Al final nuestra optimización no funciona, porqueCopyTime redimensiona el array y pone el tamaño =RequiredCount, además de que perdemos el tamaño de reserva(CopyTime no es consciente de ello).

 

Esta situación no se produciría si CopyTime copiara directamente desde el final de la matriz al punto de partida:

en el lugar:

_TimeBuf[0] = D'2017.01.01';
_TimeBuf[1] = D'2017.01.02';
_TimeBuf[2] = D'2017.01.03';

lo:

const int ArrSize = ArraySize(_TimeBuf);

_TimeBuf[ArrSize-3] = D'2017.01.01';
_TimeBuf[ArrSize-2] = D'2017.01.02';
_TimeBuf[ArrSize-1] = D'2017.01.03';
 

Las funciones de copia siempre han cambiado el tamaño de un array dinámico. A un tamaño mayor o menor. Pero siempre había una clara correspondencia con el número de registros dados como resultado de la consulta.

En tu caso la consulta original a un array con redimensionamiento dinámico. Todas las demás peticiones que solicitan un elemento a la vez, lo hacen en un array con un tamaño predefinido (datetime _TimeBuf1[1]), por lo que no hay redistribución. Autoasignar el elemento recibido a una gran matriz dinámica

 

Así que siempre ha sido así y es normal. Ya veo. Gracias por su respuesta.

Estaba al tanto de la ampliación, pero no de la reducción al tamaño de los datos solicitados. Ahora lo sabré, ¡gracias!

 

MT4 build 1065

Prueba en USDJPY TF M15

del registro de resultados:

406 2014.11.28 20:30 sell 18 5.50 118.641 0.000 117.015 0.00
521 2014.12.09 17:15 t/p 18 5.50 118.386 0.000 118.386-148.95

¿Cómo se produce la pérdida?
 
-Aleks-:

¿Cómo se produce la pérdida?

Intercambio.