Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 84

 
trader781:

Veuillez alors répondre à ma question précédente

1) Écriture d'un tableau de structures

2) Transfert à d'autres fonctions

3) Récupération et comparaison des éléments d'un tableau de structures

4) imprimer un tableau de structures

Il est important pour moi d'écrire le code afin de comprendre à quoi il doit ressembler.

Tout dépend de la tâche à accomplir. Puisque les tâches peuvent être aussi différentes que vous le souhaitez, que faut-il montrer ?

Eh bien, je l'écris, je prends mon temps et ce que j'ai écrit est carré. Et le trou est triangulaire. Et où est-ce que je mets le carré alors ?

 
Artyom Trishkin:

Tout dépend de la tâche à accomplir. Les tâches pouvant être aussi variées que vous le souhaitez, que faut-il montrer ?

Je vais l'écrire, perdre mon temps, mais ce que j'ai écrit est carré. Et le trou est triangulaire. Et où est-ce que je mets le carré alors ?

Prenons le poste 699 et environ

comment passer cela à d'autres fonctions et comparer un élément de la structure avec le précédent

ainsi je peux prendre n'importe quel ordre dans l'ordre et sortir toutes les valeurs à l'impression

La différence est qu'il ne s'agit pas d'un numéro et que les règles d'enregistrement sont différentes.

 
trader781:

Prenons le poste 699 et environ

comment passer ceci à d'autres fonctions et comparer l'élément de structure avec le précédent

et ainsi je peux prendre n'importe quel ordre dans l'ordre et imprimer toutes les valeurs

La différence est qu'il ne s'agit pas d'un nombre et que des règles d'écriture différentes s'appliquent.

Vous devez passer en boucle toutes les commandes nécessaires.

Après avoir déterminé le prochain ordre nécessaire, vous augmentez le tableau de 1 et enregistrez toutes les données relatives à cet ordre dans sa nouvelle cellule. La cellule du tableau elle-même est remplie avec l'heure d'ouverture de l'ordre (si vous recherchez des ordres fermés, alors l'heure de fermeture). Le reste des données doit être écrit dans les champs de la structure.

Une fois la boucle terminée, triez le tableau dans l'ordre croissant des valeurs.

Vous devriez faire ça en premier. Le reste peut être discuté plus avant.

 
Vitalie Postolache:

Ce n'est pas un problème qui peut être résolu en un seul cycle.

Merci.

 
Artyom Trishkin:
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct myorder
  {
   int               Ticket;
   double            orderopenprice;
   int               ordertype;
   double            profit;
   double            stoploss;
   double            lot;
  };
myorder orders[][5];

int    i;
int    Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CalcOrders();

  }
//+------------------------------------------------------------------+
void CalcOrders()
  {
   int count1=-1;
   ArrayResize(orders,AccountInfoInteger(ACCOUNT_LIMIT_ORDERS),10);
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
        {
         count1++;
         orders[count1][0].Ticket=OrderTicket();
         orders[count1][1].lot=OrderLots();
         orders[count1][2].orderopenprice=OrderOpenPrice();
         orders[count1][3].ordertype=OrderType();
         orders[count1][4].profit=OrderProfit();
         orders[count1][5].stoploss=OrderStopLoss();
        }

     }
   ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);

  }
//+------------------------------------------------------------------+
Dossiers :
test.mq4  3 kb
 
trader781:

J'ai mis votre code dans votre message.

Maintenant, si vous commencez à faire le tri

  1. Pourquoi avez-vous fait du tableau de structures un tableau multidimensionnel ?
  2. Pourquoi avez-vous changé la taille du tableau de structure dans la fonction CalcOrders() en"Nombre maximum autorisé d'ordres en attente" ? Si vous ouvrez votre aide (ce que vous devriez toujours faire), vous verrez que cet identifiant(ACCOUNT_LIMIT_ORDERS) peut retourner zéro, ce qui signifie qu'il n'y a pas de limite au nombre d' ordres en attente . La taille du tableau doit être nulle avant la boucle.
  3. Pourquoi n'augmentez-vous pas la taille du tableau dans la boucle ?
 
Artyom Trishkin:

J'ai mis votre code dans votre message.

Maintenant, si vous commencez à faire le tri

  1. Pourquoi avoir fait d'un tableau de structures un tableau multidimensionnel ?
  2. Pourquoi changez-vous la taille du tableau de structure dans la fonction CalcOrders() en"Nombre maximum autorisé d'ordres actifs en attente" ? Si vous ouvrez votre aide (ce que vous devriez toujours faire), vous verrez que cet identifiant(ACCOUNT_LIMIT_ORDERS) peut retourner zéro, ce qui signifie qu'il n'y a pas de limite au nombre d' ordres en attente . La taille du tableau doit être nulle avant la boucle.
  3. Pourquoi n'augmentez-vous pas la taille du tableau dans la boucle ?

1) a pensé que le numéro de paramètre de l'ordre X Y est plus approprié pour la tâche donnée

2) Je l'ai égal à 50 ou 100 selon le type de compte, et rien d'autre.

3) donc sicount1++ ; augmentera à chaque passage, et le tableau acquerra sa valeur

 
trader781:

1) a considéré que le numéro de paramètre de l'ordre X Y est plus approprié pour cette tâche

2) il est égal à 50 ou 100 selon le type de compte, et rien d'autre.

3) donc sicount1++ ; augmentera à chaque passage, et le tableau acquerra sa valeur

1. quelle est la structure pour alors ?

2. Vous avez besoin de ce paramètre pour un tableau de positions de marché "what went and what went"... Le tableau avant la boucle doit avoir une taille nulle .

3. C'est vrai. Le tableau a une taille nulle au début. À chaque nouvelle commande trouvée, la taille du tableau devient égale au nombre de commandes dont vous avez besoin.

 
Artyom Trishkin:

1) Quelle est la structure de l'époque ?

2. Vous avez besoin de ce paramètre pour le tableau des positions de marché "what went and what went". Le tableau avant la boucle doit avoir une taille nulle .

3. C'est vrai. Le tableau a une taille nulle au début. À chaque nouvelle commande trouvée, la taille du tableau devient égale au nombre de commandes dont vous avez besoin.

1) le compilateur se plaindra si la deuxième dimension n'est pas mise, "spécifier le type de classe, paramètres inconnus" apparaîtra immédiatement.

2) le bot mourra immédiatement au lancement avec "critical error array out of range".

3) définirint count1=-1; puis parcourir la boucle. Qu'est-ce qui ne va pas ici ?

 
trader781:

1) le compilateur se plaindra si la deuxième dimension n'est pas définie

2) alors le robot mourra immédiatement au démarrage avec "critical error array out of range" (erreur critique tableau hors de portée)

3) set immédiatementint count1=-1; Quel est le problème ici ?

Il vous indique simplement qu'une des dimensions doit être supprimée. Vous déclarez un tableau unidimensionnel et vous voulez l'écrire dans un tableau bidimensionnel. Qu'obtiendrez-vous comme résultat ? Vous obtiendrez une erreur du compilateur, bien sûr.

2. Vous devez remplir le tableau correctement dans la boucle, et non pas simplement lui donner une variable de taille aléatoire puis y insérer des éléments de taille aléatoire.

3. C'est vous qui mettez la variable à -1. Et le tableau doit avoir une taille nulle avant la boucle. Qu'est-ce que tu ne comprends pas ?

Jouons à un jeu d'association :

  • Imaginez que vous avez un ballon dégonflé (tableau vide) qui a un volume interne nul (taille du tableau nulle). A l'intérieur de ce ballon (dans le tableau) vous voulez mettre des pièces (les ordres que vous voulez). Ici, chaque pièce, une fois que vous aurez décidé qu'elle peut être stockée dans le ballon (chaque commande souhaitée trouvée), augmentera le volume interne du ballon (seule la pièce elle-même étirera le ballon, et vous devez le faire vous-même - augmenter la taille du tableau par 1 et y fourrer une commande).
    À la fin, lorsque vous aurez trouvé toutes les pièces et que vous les aurez entassées dans la boule, celle-ci ne sera pas dégonflée - son volume interne a été étiré par les pièces (à la fin du cycle de recherche, la taille du tableau sera égale au nombre d'ordres nécessaires trouvés, puisque vous avez augmenté la taille du tableau de 1 à chaque ordre nécessaire trouvé).

    Imaginez maintenant que vous mettez initialement vos pièces non pas dans une balle, qui est en caoutchouc et peut changer de taille, mais dans une petite tirelire dont la taille est limitée (vous avez initialement fixé la taille du tableau et ne l'avez pas augmentée). Que va-t-il se passer ? Toutes les pièces ne rentreront pas dans la tirelire. Le ballon sera.

Voici une association pour vous.