Erreurs, bugs, questions - page 1871

 
Konstantin:


1. quand est-il prévu d'introduire l'union ?

2. le typedef sera-t-il également introduit avec l'union ?

3. l'introduction de pointeurs sur les types fondamentaux est-elle prévue ?

1. Bientôt. Tout est prêt dans le compilateur, nous le testons maintenant. Nous le publierons après les tests.

2. On ne sait pas encore quand

3. Non, pas prévu.

 

Pour une raison quelconque,CopyTime (ou tout autre programme similaire)redimensionne le tableau de réception, mêmesi lataille du tableau de réception est plus grande que la taille à copier.

Messieurs, c'est normal ? Est-ce que ça a toujours été comme ça ? Ou un bug ?

Par exemple :

static datetime TimeBuf[]; 

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

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

La fonction CopyTime redimensionne le tableau TimeBuf à 1.

C'est une erreur de principe.

Ce ne serait pas un problème si ce n'était d'une nuance importante : les données sont copiées au début du tableau et, par conséquent, toute l'essence de l'optimisation est perdue à la racine.

 
Marat Sultanov:

Pour une raison quelconque,CopyTime (ou tout autre programme similaire)redimensionne le tableau de réception, mêmesi lataille du tableau de réception est plus grande que la taille à copier.

Messieurs, c'est normal ? Est-ce que ça a toujours été comme ça ? Ou un bug ?

Par exemple :

La fonction CopyTime redimensionne le tableau TimeBuf à 1.

C'est une erreur de principe.

Ce ne serait pas si mal, si ce n'était d'une nuance importante : les données sont copiées au début du tableau, et par conséquent, tout l'intérêt de l'optimisation est perdu à la racine.

Votre tableau est dynamique ! C'est-à-dire avec une taille variable. Comme vous n'avez pas précisé sa dimension entre crochets.

Le mot statique signifie que l'objet de ce tableau est construit lorsque le conseiller expert est chargé, et est détruit lorsqu'il est déchargé.

 
Slava:

Votre tableau est dynamique ! C'est-à-dire avec une taille variable. Comme vous n'avez pas précisé sa dimension entre crochets.

Le mot statique signifie que l'objet de ce tableau est construit au chargement de l'EA et détruit au déchargement.

Je suis désolé, mais vous n'avez pas compris.

Que le tableau soit déclaré dans la portée globale

datetime _TimeBuf[]; 

void OnTick()
{}

Ensuite :

1) La première fois que nous copions (CopyTime) dans le tableau le nombre de barres qu'il y a.

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) Selon la conception optimale, lorsqu'une nouvelle barre apparaît, nous ne voulons pas copier toutes les barres, n'est-ce pas ? Par conséquent, nous décidons de ne copier que les deux dernières mesures modifiées.

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) Au final, notre optimisation ne fonctionne pas, carCopyTime redimensionne le tableau et met la taille =RequiredCount, de plus nous perdons la taille de réserve(CopyTime n'en est pas conscient).

 

Cette situation ne se produirait pas si CopyTime copiait directement de la fin du tableau au point de départ :

à l'emplacement :

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

il :

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

Les fonctions de copie ont toujours modifié la taille d'un tableau dynamique. à une taille plus grande ou plus petite. Mais il y avait toujours une correspondance claire avec le nombre d'enregistrements donnés comme résultat de la requête.

Dans votre cas, la requête originale vers un tableau avec un redimensionnement dynamique. Toutes les autres requêtes qui demandent un élément à la fois, le font dans un tableau avec une taille prédéfinie (datetime _TimeBuf1[1]), il n'y a donc pas de redistribution. Auto-réaffectation de l'élément reçu à un grand tableau dynamique

 

Donc ça a toujours été comme ça et c'est normal. Je vois. Merci pour votre réponse !

J'étais au courant de l'agrandissement, mais pas de la réduction à la taille des données demandées. Maintenant je vais savoir, merci !

 

MT4 build 1065

Test sur USDJPY TF M15

du journal des résultats :

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

Comment la perte se produit-elle ?
 
-Aleks-:

Comment la perte se produit-elle ?

Échange.
 
Il ne compile pas
template <typename T1, typename T2>
void Func( T2 ) {}

void OnStart()
{
  Func<int>(0);
}