Questions des débutants MQL4 MT4 MetaTrader 4 - page 124

 
Игорь:
Bonjour !
Pouvez-vous me dire comment repeindre les barres sans utiliser de modèles dans mt4 ! ?
Ou comment appliquer un schéma de couleurs ?
Menu contextuel graphique, propriétés, couleurs - avez-vous essayé ?
 
Ihor Herasko:

Je vais simplifier un peu la réponse pour éviter toute confusion. Le signe (&) indique qu'un argument de fonction peut changer de valeur au moment de l'exécution et retournera à l'endroit d'où la fonction a été appelée avec une valeur différente. Dans le cas présent, la fonction SaveOrder peut modifier le contenu des tableaux g_arrstBuyOrderInfo et g_arrstSellOrderInfo, ainsi que les variables g_nBuyOrdersCnt et g_nSellOrdersCnt.

Merci. Cela devient un peu plus clair. Il n'est pas évident de savoir comment tout cela peut être découvert sans se référer au forum. Je n'ai pas trouvé de telles explications dans les tutoriels.

Veuillez me donner d'autres conseils :

1) Le compilateur écrit - 'g_nBuyOrdersCnt' - déclaration sans type ; 'g_nSellOrdersCnt' - déclaration sans type. Ai-je raison de supposer que g_nBuyOrdersCnt et g_nSellOrdersCnt doivent être déclarés globalement pour éviter une erreur du compilateur ?

2) Compilateur :les expressions 'for' ne sont pas autorisées dans une portée globale. Ce n'est pas clair ici.

3) Dans la fonctionvoid SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt), le compilateur écrit : la déclaration de 'arrstOrderInfo' cache la déclaration globale. voir la déclaration précédente de 'arrstOrderInfo'. Ce n'est pas très clair non plus.

4) 'nOrderCnt' est un identifiant non déclaré. Pourquoi n'est-il déclaré nulle part ?

Et une dernière chose : je ne comprends toujours pas d'où viennent les.n et les.f et ce qu'ils sont.




 
Игорь:

Bonjour !

Pouvez-vous me dire comment repeindre les barres sans utiliser de modèles dans mt4 ! ?

Ou comment appliquer un schéma de couleurs ?

En cas de programmation, voir les fonctions ChartSetInteger() et ChartGetInteger().

 
novichok2018:

Merci. Ça commence à avoir un peu plus de sens. On ne voit pas très bien comment on peut découvrir tout cela sans se référer à un forum. Je n'ai pas trouvé de telles explications dans les manuels scolaires.

Veuillez me donner d'autres conseils :

1) Le compilateur écrit - 'g_nBuyOrdersCnt' - déclaration sans type ; 'g_nSellOrdersCnt' - déclaration sans type. Ai-je raison de supposer que g_nBuyOrdersCnt et g_nSellOrdersCnt doivent être déclarés globalement pour éviter une erreur du compilateur ?

2) Compilateur :les expressions 'for' ne sont pas autorisées dans une portée globale. Ce n'est pas clair ici.

3) Dans la fonctionvoid SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt), le compilateur écrit : la déclaration de 'arrstOrderInfo' cache la déclaration globale. voir la déclaration précédente de 'arrstOrderInfo'. Ce n'est pas très clair non plus.

4) 'nOrderCnt' est un identifiant non déclaré. Pourquoi n'est-il déclaré nulle part ?

Voici comment tout cela devrait être dans le code si vous regardez le code dans son ensemble :

#property strict

input       int i_nMagicNumber = 12876;

#define  MAX_ORDERS_CNT   int(500)
struct OrderInfo
{
   int      nTicket;
   int      nType;
   double   fOpenPrice;
   double   fSL;
   double   fTP;
   datetime dtOpenTime;
};

int         g_nBuyOrdersCnt, 
            g_nSellOrdersCnt;

OrderInfo   g_arrstBuyOrderInfo[MAX_ORDERS_CNT], 
            g_arrstSellOrderInfo[MAX_ORDERS_CNT];

//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert initialization function                                                                                                                                                                    |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
int OnInit()
{
   return INIT_SUCCEEDED;
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert deinitialization function                                                                                                                                                                  |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Expert tick function                                                                                                                                                                              |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void OnTick()
{
    FindOrders();
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Fills the orders arrays                                                                                                                                                                           |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void FindOrders()
{
   g_nBuyOrdersCnt = 0;
   g_nSellOrdersCnt = 0;
   for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
   
      if (OrderSymbol() != Symbol())   // Если нужны ордера только по текущему символу, к графику которого прикреплен советник
         continue;
   
      if (OrderMagicNumber() != i_nMagicNumber)  // Если имеется входной параметр советника i_nMagicNumber, в котором указан ID ордеров советника
         continue;
   
      if (OrderType() == OP_BUY)
         SaveOrderInfo(g_arrstBuyOrderInfo, g_nBuyOrdersCnt);
      if (OrderType() == OP_SELL)
         SaveOrderInfo(g_arrstSellOrderInfo, g_nSellOrdersCnt);
   }
}
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
//| Saves one selected order in the specified array                                                                                                                                                   |
//+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
void SaveOrderInfo(OrderInfo &arrstOrderInfo[], int &nOrdersCnt)
{
   if (nOrdersCnt >= MAX_ORDERS_CNT)
      return;

   arrstOrderInfo[nOrdersCnt].nTicket = OrderTicket();
   arrstOrderInfo[nOrdersCnt].nType = OrderType();
   arrstOrderInfo[nOrdersCnt].fOpenPrice = OrderOpenPrice();
   arrstOrderInfo[nOrdersCnt].fSL = OrderStopLoss();
   arrstOrderInfo[nOrdersCnt].fTP = OrderTakeProfit();

   ++nOrdersCnt;
}
 
novichok2018:

Une dernière chose : je ne comprends toujours pas d'où viennent les.n et les.f et ce qu'ils sont.

L'opérateur "point" indique l'accès à un membre d'une structure ou d'une classe. Dans ce cas, il s'agit d'une structure.

Les lettres n et f sont un moyen de spécifier le type de données stockées dans une variable. Après tout, avec un nombre énorme de variables, il est impossible de se souvenir du type de chacune d'entre elles. Et si dans le nom d'une variable il y a une indication de son type, la nécessité de se souvenir disparaît d'elle-même. n est le signe d'un nombre entier (de Numeric), f est un nombre réel (de float - nombre à virgule flottante). Cette façon d'écrire les noms de variables est appelée notation hongroise.

 
Ihor Herasko:

L'opérateur point indique l'accès à un membre d'une structure ou d'une classe. Dans ce cas, une structure.

Les lettres n et f sont un moyen de spécifier le type de données qui est stocké dans une variable. Après tout, avec un nombre énorme de variables, il est impossible de se souvenir du type de chacune d'entre elles. Et si dans le nom d'une variable il y a une indication de son type, la nécessité de se souvenir disparaît d'elle-même. n est le signe d'un nombre entier (de Numeric), f est un nombre réel (de float - nombre à virgule flottante). Cette façon de noter les noms de variables est appelée notation hongroise.

C'est là ! !! Il s'avère queg_ etg_n ne sont pas seulement une abréviation, mais des préfixes indiquant qu'il s'agit de variables entières globales et globales ! !! Ugh... Et je ne comprenais pas pourquoi ces tirets dans les désignations de variables... Comment est-il possible pour un débutant, qui n'est pas familier avec ces subtilités, d'écrire du code en utilisant des tableaux, des structures, etc. J'ai pensé que ma stratégie simple pouvait être rédigée dans un langage simple, sans plonger dans la jungle.

Pourriez-vous me donner un lien vers un tutoriel détaillé (étendu) sur mcl4 à étudier en parallèle de vos conseils ?

Et pourriez-vous écrire le code ci-dessus sans utiliser la notation hongroise pour la comparaison ? Êtes-vous sûr que la plateforme MT4 le comprend clairement ?


Et une question sur le code : à quoi sert lecontinue; ?

for (int i = OrdersTotal() - 1; i >= 0; --i)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;
Si une commande n'est pas sélectionnée lors de la première itération, elle ne sera pas sélectionnée lors des itérations suivantes et le cycle se poursuivra indéfiniment ? Parce que le nombre de commandes ne change pas. Ne serait-il pas plus correct derompre avec un message d'erreur ?
 
STARIJ:
Graphiques, propriétés, couleurs du menu contextuel - avez-vous essayé ?

Merci, je l'ai déjà trouvé ! !!

 
Ihor Herasko:

En cas de programmation, voir les fonctions ChartSetInteger() et ChartGetInteger().

Merci de l'avoir déjà trouvé avec votre aide ! !!

 
novichok2018:

C'est là ! !! Il s'avère queg_ etg_n ne sont pas seulement une abréviation, mais des préfixes qui indiquent qu'il s'agit de variables entières globales et globales ! !! Ugh... Et je ne comprenais pas pourquoi ces tirets dans les désignations de variables... Comment est-il possible pour un débutant, qui n'est pas familier avec ces subtilités, d'écrire du code en utilisant des tableaux, des structures, etc. J'ai pensé que ma stratégie simple pouvait être rédigée dans un langage simple, sans plonger dans la jungle.

Pour faire quelque chose, nous devons nous plonger dans les subtilités. Il n'y a pas d'autre moyen.

Pourriez-vous me donner un lien vers un tutoriel détaillé (étendu) sur mcl4 à étudier en parallèle de vos conseils ?

Je ne connais qu'un seul manuel sur MQL4 - celui de Sergey Kovalev.

Et pourriez-vous écrire le code ci-dessus sans utiliser la notation hongroise pour la comparaison ? Êtes-vous sûr que la plateforme MT4 le comprend clairement ?

Habituez-vous tout de suite à un formatage de code correct ;)) La notation hongroise a été inventée par des programmeurs assez expérimentés.

Et une question sur le code : à quoi sert lecontinue; ?

Donc, si une commande n'est pas sélectionnée à la première itération, elle ne le sera pas aux suivantes et la boucle se poursuivra à l'infini ? Parce que le nombre de commandes ne change pas. Ne serait-il pas plus correct derompre avec un message d'erreur ?

Si nous n'avons pas réussi à sélectionner une commande, cela ne signifie pas que nous ne serons pas en mesure de sélectionner la commande suivante. Il est donc raisonnable de poursuivre la boucle.

Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
В настоящее время персональный компьютер стал незаменимым помощником в жизни каждого человека. Благодаря развитию Интернета и увеличению мощности современных компьютеров открылись новые возможности во многих областях деятельности. Ещё десять лет назад торговля на финансовых рынках была доступна только банкам и узкому кругу специалистов. Сегодня...
 
Ihor Herasko:

Le fait de ne pas sélectionner une commande ne signifie pas que la commande suivante ne peut pas être sélectionnée. Il est donc raisonnable de poursuivre le cycle.

Et il n'est pas nécessaire d'afficher un message d'erreur? Peut-être serait-il utile de savoir pourquoi une commande n'est pas trouvée et comment l'éviter ?

Raison: