Comment faire pour passer une énumération de manière cohérente ? - page 5

 
Sergei Vladimirov:
Pourquoi je ferais ça ?
TickSize sur MIX est 25, Digits est 0. La normalisation d'un prix entier qui n'est pas un multiple de 25 provoquera une erreur OrderSend.
 
fxsaber:
TickSize sur MIX est 25 et Digits est 0. La normalisation d'un prix entier qui n'est pas un multiple de 25 provoquera une erreur OrderSend.
A l'instant, dans un fil voisin, on conseille de noyer l'ordinateur dans la baignoire, puis tout sera encore plus discrédité.
 
Dmitry Fedoseev:
A l'instant, dans un fil voisin, conseiller de noyer l'ordinateur dans la baignoire, puis tout sera encore plus discrédité.
Vous êtes une pipelette, malheureusement. Je ne crée rien, mais j'ai le droit de critiquer - sur vous.
 
fxsaber:
TickSize sur MIX est 25 et Digits est 0. La normalisation d'un prix entier qui n'est pas un multiple de 25 provoquera une erreur OrderSend.
Eh bien, avec cette logique, même dans un pas de 0,25, la normalisation produirait une erreur. Le but de la normalisation n'est pas d'ajuster le prix à un échelon de prix exotique, mais d'arrondir le nombre à virgule flottante à une précision donnée. Il ne provoque aucune erreur.
 
Sergei Vladimirov:
Eh bien, avec cette logique, même dans le cas d'un pas de 0,25, la normalisation produirait une erreur. Le but de la normalisation n'est pas d'ajuster le prix à un échelon de prix exotique, mais d'arrondir le nombre à virgule flottante à une précision donnée. Il ne conduit à aucune erreur.
La normalisation n'a été introduite à l'origine que pour une seule chose (et elle est mentionnée dans l'aide) : les fonctions de négociation.
 
Vladimir Batrudinov:

Il y a probablement deux fonctions qui doivent être saisies : 1 - renvoie le nombre d'éléments dans l'enum, 2 - renvoie l'élément par numéro...


Dans un enum, vous pouvez attribuer n'importe quelle valeur aux éléments, par exemple, comme ci-dessous. Un enum n'est pas un tableau.

enum crazy
{
    e1 = 100500,
    e2 = -200,
    e3 = -100500,
    e4 = 0
};


//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
{
    int z10 = e2;
    int z1 = e4;
  
}

Des langages comme C# exigent de spécifier le nom de l'enum, tandis que C++ et donc MQL4/5 gèrent les enum plutôt librement. Au cas où, cette absurdité compile aussi bien sur MQL5 que sur C++.

 
Alexey Volchanskiy:

Dans un enum, vous pouvez attribuer n'importe quelle valeur aux éléments, comme dans l'exemple suivant. L'enum n'est pas un tableau.

Et alors ? Il s'agissait de parcourir les éléments dans l'ordre de la déclaration.
 
Alexey Navoykov:
Et alors ? Il s'agissait de passer en revue ces éléments par ordre de déclaration.
Oh, c'est vrai, j'ai mal lu la question, j'ai pensé, par valeurs.
 

Une note aux programmeurs :

#define  ENUM_QQ             \
  ENUM_QQ_HELPER(el_1, 3)   \
  ENUM_QQ_HELPER(el_2, 9)   \
  ENUM_QQ_HELPER(el_3, 38)  \
  ENUM_QQ_HELPER(el_4, 1)   

enum Enum_qq
{
#define  ENUM_QQ_HELPER(el, val) el = val,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
};

void get_enumqq_array(int &ar[])
{
  int temp[] = {
#define  ENUM_QQ_HELPER(el, val) el,
  ENUM_QQ
#undef  ENUM_QQ_HELPER
  };
  ArrayResize(ar, ArraySize(temp));
  for(int i = 0;  i < ArraySize(temp);  ++i)
    ar[i] = temp[i];
}

void OnStart()
{
  int q[];
  get_enumqq_array(q);
  for(int i = 0;  i < ArraySize(q);  ++i)
    Alert(q[i]);
}


Maintenant, si nous devons modifier une énumération, nous devons le faire une fois et à un seul endroit. Nous devons ajouter un nouvel élément, par exemple element_new = 56, nous ajoutons

ENUM_QQ_HELPER(element_new , 56)

Et ne prenez pas la peine d'éditer get_enumqq_array(). Cette technique s'appelle X Macro https://en.wikipedia.org/wiki/X_Macro. Si les développeurs le souhaitent, ils peuvent facilement modifier l'énumération standard de cette manière.

Peut-être pas immédiatement évidente, l'énumération s'est déroulée de cette façon :

enum Enum_qq
{
   el_1 = 3
   el_2 = 9
   el_3 = 38
   el_4 = 1   
};
 
Vasiliy Sokolov:

Disons que nous avons une énumération. Comment obtenir toutes les valeurs possibles de cette énumération une par une, par exemple dans une boucle ?

C'est-à-dire que tf1++ doit retourner séquentiellement PERIOD_M1, PERIOD_M2, PERIOD_M5.... Je pense que cela ne peut pas être fait avec les outils linguistiques.

Mais en théorie, s'il existe un ENUM_MYENUM, le (ENUM_MYENUM)INT_MAX devrait donner la valeur maximale de l'énumération. Sinon, il s'agit d'un bogue de conversion de type. C'est juste parce que l'opérateur de conversion de type doit retourner la valeur de ce même type. Pas nécessairement valable dans le contexte, mais valable pour le type.
Raison: