Errori, bug, domande - pagina 1871

 
Slava:
E non dovrebbe essere possibile


1. Quando è prevista l'introduzione dell'unione?

2. saranno inseriti anche i typedef?

3. è prevista l'introduzione di puntatori ai tipi fondamentali?
 
Konstantin:


1. quando è prevista l'introduzione dell'unione?

2. anche i typedef saranno introdotti con l'unione?

3. È prevista l'introduzione di puntatori ai tipi fondamentali?

1. Presto. Tutto è pronto nel compilatore, lo stiamo testando ora. Lo rilasceremo dopo i test.

2. Non si sa ancora quando

3. no, non è previsto.

 

Per qualche motivo,CopyTime (o qualsiasi altro simile)ridimensiona l'array di ricezione, anchese ladimensione dell'array di ricezione è più grande della dimensione da copiare.

Signori, è normale? È sempre stato così? O un bug?

Per esempio:

static datetime TimeBuf[]; 

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

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

La funzione CopyTime ridimensiona l'array TimeBuf a 1.

Questo è sbagliato in linea di principio.

Non sarebbe un problema se non fosse per un'importante sfumatura: i dati vengono copiati all'inizio dell'array e, di conseguenza, l'intero punto di ottimizzazione viene perso alla radice.

 
Marat Sultanov:

Per qualche motivo,CopyTime (o qualsiasi altro simile)ridimensiona l'array di ricezione, anchese ladimensione dell'array di ricezione è più grande della dimensione da copiare.

Signori, è normale? È sempre stato così? O un bug?

Per esempio:

La funzione CopyTime ridimensiona l'array TimeBuf a 1.

Questo è sbagliato in linea di principio.

Non sarebbe così male, se non fosse per una sfumatura importante: i dati vengono copiati all'inizio dell'array, e di conseguenza, tutto il punto dell'ottimizzazione viene perso alla radice.

La tua matrice è dinamica! Cioè con una dimensione variabile. Poiché non avete specificato la sua dimensione tra parentesi quadre.

La parola static significa che l'oggetto di questo array viene costruito quando l'Expert Advisor viene caricato e viene distrutto quando viene scaricato.

 
Slava:

La tua matrice è dinamica! Cioè con una dimensione variabile. Dato che non hai specificato la sua dimensione tra parentesi quadre.

La parola static significa che l'oggetto di questo array è costruito al caricamento di EA e distrutto allo scaricamento

Mi dispiace, ma non hai colto il punto.

Che l'array sia dichiarato nell'ambito globale

datetime _TimeBuf[]; 

void OnTick()
{}

Allora:

1) La prima volta copiamo (CopyTime) nell'array quante barre ci sono.

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) Secondo il design ottimale, quando appare una nuova barra, non vogliamo copiare tutte le barre, giusto? Pertanto, decidiamo di copiare solo le ultime 2 barre modificate.

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) Alla fine la nostra ottimizzazione non funziona, perchéCopyTime ridimensiona l'array e mette la dimensione =RequiredCount, in più perdiamo la dimensione di riserva(CopyTime non ne è consapevole).

 

Questa situazione non si verificherebbe se CopyTime copiasse direttamente dalla fine dell'array al punto di partenza:

sul posto:

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

esso:

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';
 

Le funzioni di copia hanno sempre cambiato la dimensione di un array dinamico. In una dimensione più grande o più piccola. Ma c'era sempre una chiara corrispondenza con il numero di record dato come risultato della query.

Nel tuo caso la query originale a un array con ridimensionamento dinamico. Tutte le altre richieste che richiedono un elemento alla volta, lo fanno in un array con una dimensione predefinita (datetime _TimeBuf1[1]), quindi non c'è ridistribuzione. Auto-allocare l'elemento ricevuto in un grande array dinamico

 

Quindi è sempre stato così ed è normale. Capisco. Grazie per la vostra risposta!

Ero consapevole dell'ingrandimento, ma non del restringimento alla dimensione dei dati richiesti. Ora lo saprò, grazie!

 

MT4 build 1065

Test su USDJPY TF M15

dal registro dei risultati:

406 2014.11.28 20:30 vendere 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

Come avviene la perdita?
 
-Aleks-:

Come avviene la perdita?

Scambio.