Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 547

 
moskitman:

Bien sûr que oui, mais...

Je doute fortement de l'exactitude de la conception

Ici https://www.mql5.com/ru/forum/119342 est une bonne fonction pour obtenir une liste des symboles disponibles dans le terminal, dans ce cas je ne vois pas trop l'intérêt de comparer le symbole de l'ordre avec les noms des symboles du courtier dans ce compte, mais dans d'autres cas c'est très utile.

Et dans ce cas pour exclure les suffixes

string smbl=StringSubstr(OrderSymbol(),0,6);
if (smbl=="EURUSD") priceEU1=OrderOpenPrice();
 
Zolotai:

Pouvez-vous me dire. Où se trouve la section sur les paramètres. C'est-à-dire la mise en page, les cases à cocher, les flèches, etc.


Pourriez-vous s'il vous plaît déchiffrer ce dont il s'agit.
 
Vinin:

Pourriez-vous déchiffrer ce dont nous parlons ?
"Lego".
 
GSB:

Merci.

La condition est passée, l'erreur était dans une autre partie du code. :)

 

Dans l'aide, il est écrit que :

"Gardez à l'esprit que dans MQL4 les éléments de structure se suivent directement sans alignement."

Qu'entendez-vous par " alignement"?

Si j'ai bien compris, les éléments alignés ressembleront à ceci :

struct trade_settings
  {
   uchar  slippage;     // значение допустимого проскальзывания -размер 1 байт
   char   reserved1;    // 1 байт пропуска
   short  reserved2;    // 2 байта пропуска
   int    reserved4;    // еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт
   double take;         // значения цены фиксации прибыли
   double stop;         // значение цены защитного стопа
  };
et pas alignés comme ça :
struct trade_settings
  {
   uchar slippage;     // значение допустимого проскальзывания -размер 1 байт
   char reserved1;     // 1 байт пропуска
   short reserved2;    // 2 байта пропуска
   int reserved4;      // еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
  };

N'est-ce pas ?

Ce qui m'étonne, c'est qu'en programmation, le point fondamental est que le compilateur saute les espaces, mais ici il s'avère que cela affecte quelque chose...

 
hoz:

Dans l'aide, il est écrit que :

"Gardez à l'esprit que dans MQL4 les éléments de structure se suivent directement sans alignement."

Qu'entendez-vous par " alignement"?

Si j'ai bien compris, les éléments alignés ressembleront à ceci :

et non alignés comme ça : d'accord ?

Tout est décrypté dans les commentaires

еще 4 байта пропуска. Обеспечили выравнивание на границу 8 байт

Les éléments d'une structure peuvent avoir des types différents et, par conséquent, des longueurs différentes en octets, mais la mémoire de chaque élément est allouée de la même manière - par le membre maximum. Dans l'exemple, il s'agit de deux fois 8 octets.

En fait, il n'y a que 3 éléments dans la structure mais le premier n'occupe qu'un seul octet et nous devons allouer 7 autres octets "vides" pour l'aligner avec les deux derniers éléments. Il est plus facile de décrire une structure spécifique comme ceci

struct trade_settings
  {
   ulong slippage;     // значение допустимого проскальзывания, но потом наверняка понадобится приведение в int перед подстановкой в OrderSend()
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
  };
 

Le compilateur ajoute donc le nombre d'octets requis pour chaque élément ? Je veux dire les espaces, qui ne sont pas nécessaires dans l'exemple ?

Et d'ailleurs, si

GSB:

Les structures peuvent avoir des types différents et donc des longueurs différentes en octets, mais la mémoire de chaque élément est allouée de la même manière - par le membre maximum. Dans l'exemple, il s'agit de deux fois 8 octets.


Si c'est le cas, et qu'il n'y a de toute façon qu'une seule mémoire allouée pour chaque élément, quelle différence cela fait-il de savoir dans quel ordre les éléments de la structure sont placés ?
 
hoz:

Le compilateur ajoute donc le nombre d'octets requis pour chaque élément ? Je veux dire les espaces, qui ne sont pas nécessaires dans l'exemple ?

Et d'ailleurs, si


Si c'est le cas et qu'une seule mémoire est de toute façon allouée pour chaque élément, quelle différence cela fait-il de savoir dans quel ordre disposer les éléments de la structure ?

Non, ce n'est pas le cas. Si vous mettez int slippage en premier, 4 octets seront alloués, donc vous devez ajouter jusqu'à 8 ( int reserve) ou utiliser long au lieu de int

Citation de l'aide

Внимание: данный пример иллюстрирует неправильно спроектированные данные. 
Лучше было бы сначала объявить данные take и stop большего размера типа double, а затем объявить член slippage типа uchar. 
В этом случае внутреннее представление данных будет всегда одинаково независимо от значения

L'option correcte, qui ne nécessite pas d'alignement, est

struct trade_settings
  {
   double take;        // значения цены фиксации прибыли
   double stop;        // значение цены защитного стопа
   int slippage;       // значение допустимого проскальзывания
  };
 
Je suis en train d'écrire un EA multi-devises, en extrayant le ask et le bid des autres devises, en les normalisant, mais il y a toujours des chiffres supplémentaires dans le prix.
     USDCADAsk = NormalizeDouble(MarketInfo("USDCAD",MODE_ASK),Digits);            
     USDCADBid = NormalizeDouble(MarketInfo("USDCAD",MODE_BID),Digits);
     USDCHFAsk = NormalizeDouble(MarketInfo("USDCHF",MODE_ASK),Digits);
     USDCHFBid = NormalizeDouble(MarketInfo("USDCHF",MODE_BID),Digits);
     USDJPYAsk = NormalizeDouble(MarketInfo("USDJPY",MODE_ASK),Digits);
     USDJPYBid = NormalizeDouble(MarketInfo("USDJPY",MODE_BID),Digits);
     EURUSDAsk = NormalizeDouble(MarketInfo("EURUSD",MODE_ASK),Digits);
     EURUSDBid = NormalizeDouble(MarketInfo("EURUSD",MODE_BID),Digits);
     GBPUSDAsk = NormalizeDouble(MarketInfo("GBPUSD",MODE_ASK),Digits);
     GBPUSDBid = NormalizeDouble(MarketInfo("GBPUSD",MODE_BID),Digits);
     AUDUSDAsk = NormalizeDouble(MarketInfo("AUDUSD",MODE_ASK),Digits);
     AUDUSDBid = NormalizeDouble(MarketInfo("AUDUSD",MODE_BID),Digits);
     NZDUSDAsk = NormalizeDouble(MarketInfo("NZDUSD",MODE_ASK),Digits);
     NZDUSDBid = NormalizeDouble(MarketInfo("NZDUSD",MODE_BID),Digits);
 
Example2:
Veuillez me conseiller, j'écris un EA multi-devises, je sors les ask et bid des autres devises, je les normalise, mais il y a toujours quelques chiffres supplémentaires dans le prix.

Les
chiffres doivent de préférence être "tirés" du symbole approprié également ;)