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

 
trader781:

Je sais en théorie pourquoi cela s'est produit. Ma question est donc la suivante : pouvons-nous parler brièvement de l'utilisation des tableaux ?

Où devez-vous les initialiser, les supprimer et les traiter pour qu'ils fonctionnent ?

P.S.

quand google le bannit, ça ressemble à quelque chose comme ça :

Qu'est-ce qui te fait penser que c'est à propos d'un tableau ?
 
Alexey Viktorov:
Pourquoi pensez-vous que c'est à cause du tableau ?
Parce que cela n'est jamais arrivé avant, et si c'est le cas, j'ai fait une erreur quelque part, c'est pourquoi je viens ici. Vous pouvez le faire vous-même, mais cela prend beaucoup plus de temps.
 
trader781:

besoin de

1) le créer quelque part (dans une zone globale, comme une fonction, dans onit ou ontic ?)

2) inscrivez-y chaque billet lors de l'envoi d'une commande, en lui donnant un numéro d'ordre

3) les faire sortir de là au fur et à mesure des besoins par le biais du numéro.

4) Lors de la fermeture de l'ensemble de la grille, remettez les paramètres à zéro.

Vous n'avez pas besoin de le garder en mémoire tout le temps. Lorsque vous devez le trouver, vous devez appeler la fonction avec un tableau local dans lequel vous placerez tous les ordres/positions dans la boucle, vous trierez le tableau comme vous le souhaitez, vous sélectionnerez les ordres nécessaires, vous en ferez ce que vous voulez, et lorsque vous quitterez la fonction, vous oublierez ce tableau local. Et la prochaine fois que vous appellerez à nouveau la fonction, elle triera les ordres/positions qui seront présents au moment de cet appel, et fera de même avec eux. Et vous n'avez pas besoin d'un réseau global que vous devez surveiller et contrôler en permanence.
 
Artyom Trishkin:
Vous n'avez pas besoin de le garder en mémoire tout le temps. Lorsque vous avez besoin de le trouver, vous appelez la fonction avec un tableau local à l'intérieur duquel vous placez tous les ordres/positions dans la boucle, vous triez le tableau selon vos besoins, vous sélectionnez les ordres nécessaires, vous en faites ce que vous voulez, et lorsque vous quittez la fonction, vous oubliez ce tableau local. Et la prochaine fois que vous appellerez à nouveau la fonction, elle triera les ordres/positions qui seront présents au moment de cet appel, et fera de même avec eux. Et vous n'avez pas besoin d'un tableau global que vous devez constamment surveiller et contrôler.

Je ne sais pas à quel point c'est moins cher. Chaque situation a sa propre solution. Il n'existe pas d'événement OnTradeTransaction() dans MQL4, mais nous devons garder la trace de "nos" ordres d'une manière ou d'une autre... C'est là que le tableau de variables globales s'avère utile.

Imaginez que plusieurs Expert Advisors fonctionnent sur un compte, l'un d'entre eux effectue des calculs lourds, et l'autre a un nombre énorme d'ordres... Comment cela fonctionnerait-il avec des calculs lourds ? Cet EA devra-t-il rechercher une quantité énorme d'ordres ? Vous ne pouvez pas vous passer de la recherche en général, mais vous devriez minimiser cette procédure.

Et pour déterminer si la commande est clôturée ou non ? Passer en revue toute l'histoire ? N'est-ce pas trop cher ?

 
trader781:
Je n'ai jamais fait ce genre d'erreur auparavant, mais si c'est le cas, j'ai fait une erreur, c'est pourquoi je demande ici. Je pourrais le faire moi-même, mais cela prend beaucoup plus de temps.

Comme vous l'avez compris dans mon précédent message, j'utilise assez souvent les tableaux et je n'ai jamais eu de problèmes avec eux. J'ai écrit une fois un EA qui ouvrait plus de 2000 ordres dont les tickets étaient stockés dans un tableau et il n'y avait aucun problème. Je ne peux pas croire que les problèmes apparaissent à cause du tableau. Je n'arrive pas non plus à croire quelle erreur a pu causer de tels problèmes.

Cela me rappelle le film "It Can't Be"... "Ce n'est pas la bière qui tue les gens, c'est l'eau qui tue les gens"...

 
Alexey Viktorov:

Je ne sais pas à quel point c'est moins cher. Chaque situation a sa propre solution. Il n'existe pas d'événement OnTradeTransaction() dans MQL4, mais nous devons garder la trace de "nos" ordres d'une manière ou d'une autre... C'est là que le tableau de variables globales s'avère utile.

Imaginez que plusieurs Expert Advisors fonctionnent sur un compte, l'un d'entre eux effectue des calculs lourds, et l'autre a un nombre énorme d'ordres... Comment cela fonctionnerait-il avec des calculs lourds ? Cet EA devra-t-il rechercher une quantité énorme d'ordres ? On ne peut pas se passer de la recherche en général, mais il serait bien de minimiser cette procédure.

Comment vérifier si la commande a été clôturée ? Passer en revue toute l'histoire ? N'est-ce pas trop cher ?

Tout peut être résolu.

Par exemple, j'ai créé depuis longtemps une classe qui surveille tout cela. Vous pouvez créer/supprimer des objets de classe de façon dynamique pour chaque symbole, magik, timeframe, ou tous pour un compte ou une combinaison de ceux-ci - vous pouvez choisir. Tout cycle de recherche nécessaire est déjà effectué une fois sur un nouveau tick, et il y a toutes les données nécessaires. Bien sûr, il y a des cas où il est impossible de se passer d'un cycle supplémentaire, mais il s'agit du deuxième cycle supplémentaire par tic. Et ne pas avoir une boucle séparée dans chaque fonction est un terrible gaspillage de ressources.

 
Artyom Trishkin:

Tout est soluble.

Moi, par exemple, j'ai créé depuis longtemps une classe qui s'occupe de tout cela. Vous pouvez créer/supprimer des objets de classe de manière dynamique pour chaque symbole, magik, timeframe, ou tous pour un compte, ou des combinaisons de ceux-ci - vous pouvez choisir. Tout cycle de recherche nécessaire est déjà effectué une fois sur un nouveau tick, et il y a toutes les données nécessaires. Bien sûr, il y a des cas où il est impossible de se passer d'un cycle supplémentaire, mais il s'agit du deuxième cycle supplémentaire par tic. Et ne pas avoir une boucle séparée dans chaque fonction est un terrible gaspillage de ressources.

Eh bien, personne ne le conteste. Elle est devenue encore plus pratique avec l'avènement des structures.
 
Artyom Trishkin:
Vous n'avez pas besoin de le garder en mémoire tout le temps. Lorsque vous avez besoin de le trouver, vous devez appeler la fonction avec un tableau local à l'intérieur duquel vous placerez tous les ordres/positions dans la boucle, vous trierez le tableau comme vous le souhaitez, vous sélectionnerez les ordres nécessaires, vous en ferez ce que vous voulez, et lorsque vous quittez la fonction, vous oubliez ce tableau local. Et la prochaine fois que vous appellerez à nouveau la fonction, elle triera les ordres/positions qui seront présents au moment de cet appel, et fera à nouveau la même chose avec eux. Et vous n'avez pas besoin d'un réseau global que vous devez surveiller et contrôler en permanence.

OK, voici une vue simplifiée.

Si le tableau est local, où voulez-vous le mettre ? Évidemment pas dans l'ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

 
trader781:

OK, voici une vue simplifiée.

Si le tableau est local, où dois-je le mettre ? Évidemment pas dans l'ontik.

void OnTick()
{  

       if(FindLastOType()==OP_BUY)  //+------ если последний покупка
           {
            if(Ask<=FindLastOrderOpenPrice()-Step*Point())//+------------если ордер в минус
              {
               TotalClose();
              }
            else
            if(Ask>=FindLastOrderOpenPrice()+Step*Point())//+------------если ордер в плюс и это 5 ордер в списке
              {
               ticket=OrderSend(Symbol(),OP_BUY,(лот2 ордера+лот4 ордера),Ask,50,0,0,"",Magic,0,clrAzure);
              }        
           }  
}

Veuillez lire ce qu'est une fonction. Vous comprendrez alors que le tableau déclaré dans le corps de la fonction sera local - hors de vue du reste du programme.
 
bool WriteToFile(int FileHandle,string DataToWrite)
  {
// Receives the number of bytes written to the file. Note that MQL can only pass
// arrays as by-reference parameters to DLLs
   int BytesWritten[1]={0};

// Get the length of the string
   int szData=StringLen(DataToWrite);

// Do the write
   WriteFile(FileHandle,DataToWrite,szData,BytesWritten,0);

// Return true if the number of bytes written matches the expected number
   return (BytesWritten[0] == szData);
  }

Je veux écrire une ligne dans le fichier avec des traductions vers une nouvelle ligne, mais ça ne marche pas, ce code vient d'icihttps://www.mql5.com/en/forum/118999.

Ce code écrit une ligne avec des espaces après chaque lettre, j'ai besoin d'un remplacement pour FileWrite() mais cela fonctionne.

Reading and writing files anywhere on disk using CreateFileA() etc.
Reading and writing files anywhere on disk using CreateFileA() etc.
  • www.mql5.com
There are frequent questions in this forum (e.g...