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

 

C'est ça, j'ai trouvé mon erreur. Certaines personnes ont besoin d'exprimer leur question afin de comprendre plus tard comment elles se sont trompées.

Malheureusement, apparemment, je suis l'un de ces personnages. (((

 

Je suppose que vous voulez dire parnuméro de billet ?

Des écueils ?

 
Decromor:

Salutations !


On peut accéder à une commande en utilisant la commande OrderSelect par son numéro.

Question : est-il possible de connaître à l'avance les numéros des commandes existantes, afin de ne pas les passer toutes en revue ? Par exemple, nous pouvons mémoriser ce numéro lors de l'ouverture d'une nouvelle commande.

Je comprends que ce numéro est attribué dans l'ordre en partant de 1. Quelles sont les nuances possibles ?

Je vous remercie à l'avance.

  1. On peut adresser cet ordre par son index dans la liste des ordres (lorsqu'on l'essaie dans la boucle), ou par son ticket (s'il est connu à l'avance).
  2. Non souhaitable - en cas de panne (redémarrage du Conseiller Expert, redémarrage du terminal, panne du système, etc.), les tickets mémorisés peuvent être perdus. Il faut donc les stocker soit dans des variables globales du terminal, soit dans un fichier, ce qui est faisable, mais plus difficile que la recherche habituelle, qui n'est pas effectuée à chaque tic, mais seulement en cas de besoin.
  3. Non. En commençant par le numéro 1, et par ordre croissant - uniquement dans le testeur.
  4. Vous êtes les bienvenus.
 
Artyom Trishkin:
  1. Vous pouvez vous y référer par son index dans la liste des commandes (lors d'une recherche dans la boucle), ou par son ticket (s'il est connu à l'avance).
  2. Non souhaitable - en cas de panne (redémarrage de l'EA, redémarrage du terminal, panne du système, etc.), les tickets mémorisés peuvent être perdus. Il faut donc les stocker soit dans des variables globales du terminal, soit dans un fichier, ce qui est faisable, mais plus difficile que la recherche habituelle, qui n'est pas effectuée à chaque tic, mais seulement en cas de besoin.
  3. Non. En commençant par le numéro 1, et par ordre croissant - uniquement dans le testeur.
  4. S'il vous plaît.

Est-il possible d'exécuter dans le code OnInit() dans la boucle OrdersTotal() et de rassembler toutes les informations sur les ordres ouverts, en particulier OrderTicket() ?

string orders[][3];

int OnInit() {
   for (int n = OrdersTotal() + 1; n >= 0; n--) {              
      if (OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) {
         int i = (ArraySize(orders) / 3);
         ArrayResize(orders, i + 1);
         orders[i][0] = IntegerToString(OrderTicket());
         orders[i][1] = IntegerToString(OrderType());
         orders[i][2] = DoubleToString(OrderOpenPrice(), Digits);   
      } 
   }
   return(INIT_SUCCEEDED);
}


Lorsqu'un ordre est automatiquement fermé par TP ou SP, est-il possible d'obtenir les données de cet ordre ?

 
Decromor:

Est-il possible d'exécuter le programme dans le corps OnInit() et de collecter toutes les informations sur les ordres ouverts, en particulier OrderTicket(), dans la boucle OrdersTotal() ?


Lorsqu'un ordre est fermé automatiquement par TP ou SP, est-il possible d'obtenir les données de cet ordre ?

  1. Oui, nous le pouvons. Et puis quoi ? Les commandes peuvent changer au fil du temps, et les informations recueillies lors de l'initialisation sont périmées.
  2. Nous devons trouver la dernière commande fermée et obtenir toutes les informations nécessaires à son sujet.
 
Artyom Trishkin:
  1. Vous pouvez. Et puis quoi ? Les commandes peuvent changer avec le temps, et les informations les concernant, recueillies lors de l'initialisation, deviendront obsolètes.
  2. Il faut trouver le dernier ordre fermé et obtenir toutes les informations nécessaires à son sujet.

Pendant l'achat et la vente, j'enregistre les données requises dans un tableau, puis je fais rouler ce tableau et, en fonction du prix, j'effectue les changements requis (transfert du SL vers le Breakeven, fermeture de l'ordre après l'inversion, etc.

Mais j'ai des ordres avec TP et SL qui peuvent se fermer à mon insu. Je n'aime pas l'option qui consiste à rechercher le dernier ordre clôturé à chaque tick et à le chercher dans mon tableau pour le corriger.

"Les commandes peuvent changer au fil du temps, et les informations recueillies à leur sujet lors de l'initialisation deviendront obsolètes." Je suppose que c'est ce que l'on entend par "clôture de la commande" ?

La seule option que je vois est de faire 2 boucles dans un tick, la mienne avec orders etOrdersTotal() et je n'aime pas ça non plus.

"Mais plus compliqué que l'énumération habituelle, qui ne se fait pas à chaque tic, mais seulement en cas de besoin" Veuillez partager cet algorithme.

 
Decromor:

Est-il possible d'exécuter le programme dans le corps OnInit() et de collecter toutes les informations sur les ordres ouverts, en particulier OrderTicket(), dans la boucle OrdersTotal() ?


Lorsqu'un ordre est automatiquement fermé par TP ou SP, est-il possible d'obtenir les données de cet ordre ?

Et pourquoi avons-nous besoin de convertir tout cela en une chaîne de caractères ? S'agit-il d'un type de chaîne?

 
Decromor:

Est-il possible d'exécuter le programme dans le corps OnInit() et de collecter toutes les informations sur les ordres ouverts, en particulier OrderTicket(), dans la boucle OrdersTotal() ?


Lorsqu'un ordre est automatiquement fermé par TP ou SP, est-il possible d'obtenir les données de cet ordre ?

struct SOrders
{
     int ticket,
         type;
     double price;
} orders[];

int OnInit() {
   for (int n = 0; n < OrdersTotal(); n++)
   {              
      if(!OrderSelect(n, SELECT_BY_POS, MODE_TRADES)) continue;
      int i = ArraySize(orders);
      if(ArrayResize(orders, i+1) < i+1) continue;
      orders[i].ticket = OrderTicket();
      orders[i].type   = OrderType();
      orders[i].price  = OrderOpenPrice();
   }
   return(INIT_SUCCEEDED);
}
 
Konstantin Nikitin:
Merci beaucoup pour ces informations, c'est nouveau pour moi.
 
Alexey Viktorov:

Pourquoi traduire tout cela en une chaîne de caractères ? Type de chaîne?

Parce que, par exemple, un ticket a le type Int, le prix Double, et un tableau ne peut être que d'un seul type.