Questions des débutants MQL5 MT5 MetaTrader 5 - page 1374

 
Alexey Viktorov #:

Quelqu'un t'a mal enseigné. La variable _LastError stockera la valeur jusqu'à ce que la prochaine erreur se produise.


Eh bien, regardez, au début du code principal l'erreur suivante se produit

ERR_INVALID_DATETIME

4010

Valeur incorrecte de la date et/ou de l'heure


Et ensuite, un objet est créé par le code et _LastError est réécrit en

ERR_OBJET_NON_TROUVÉ

4202

Objet graphique non trouvé


Si la vérification de _LastError se trouve à la fin du code, comme je le fais habituellement, j'obtiendrai 4202 et je l'ignorerai. Autrement dit, l'erreur 4010 passera inaperçue. Où ai-je tort ?

Alexey Viktorov #:


Une exigence du marché est qu'aucune erreur d'exécution ne soit reçue du serveur du courtier.

Merci, je ne le savais pas, je pensais que toutes les erreurs étaient interdites.

 
leon_17 #:

Eh bien, regardez, au début du code principal, par exemple, l'erreur suivante se produit :

ERR_INVALID_DATETIME

4010

Valeur incorrecte de la date et/ou de l'heure


Et ensuite, un objet est créé par le code et _LastError est réécrit en

ERR_OBJET_NON_TROUVÉ

4202

Objet graphique non trouvé


Si la vérification de _LastError se trouve à la fin du code, comme je le fais habituellement, j'obtiendrai 4202 et je l'ignorerai. Autrement dit, l 'erreur 4010 passera inaperçue. Où est-ce que je me trompe ?

Merci, je ne le savais pas, je pensais que toutes les erreurs étaient interdites.

Exactement. Vous n'avez pas tort...

 

Bonjour, quelqu'un peut-il me donner un indice ?

J'écris les valeurs temporelles de chaque barre spécifiquement dans un tableau. Il y a une limite de 3000 barres sur le graphique.

La tâche :

- Pour décaler le tableau des valeurs à chaque nouvelle barre.

void CNewBar::PriceHL2()
  {
   int start= 0;
   ArrayResize(this.m_tim_pr_hl2,this.m_rt);
  
   if(this.m_pc!=0)
     {
      start= this.m_pc;
      ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc);
     }  
   for(int b= start; b < this.m_rt; b++)
     {
      this.m_tim_pr_hl2[b]= iTime(this.m_symbol, this.m_timeframe, this.m_rt-b);
     }
  }

Je n'arrive pas à le régler pour qu'il fonctionne correctement.

Est-ce que je décale correctement le tableau sur une nouvelle barre si (this.m_rt-this.m_pc)=1 ?

ArrayCopy(this.m_tim_pr_hl2, this.m_tim_pr_hl2, 0, this.m_rt-this.m_pc); // this.m_rt-this.m_pc=1
 
Mikhail Toptunov #:

Bonjour, quelqu'un peut-il me donner un indice ?

J'écris les valeurs temporelles de chaque barre spécifiquement dans un tableau. Il y a une limite de 3000 barres sur le graphique.

La tâche :

- Pour décaler le tableau des valeurs à chaque nouvelle barre.

Je n'arrive pas à le régler pour qu'il fonctionne correctement.

Ai-je raison de décaler le tableau sur une nouvelle barre si (this.m_rt-this.m_pc)=1 ?

C'est-à-dire que la taille du tableau doit être exactement 3000 et qu'à la formation d'une nouvelle barre, l'index zéro doit être écrasé en premier ......... et à la fin écrire la nouvelle valeur ?

Si j'ai bien compris, quel est le but de la boucle ? Il suffit de copier le tableau lui-même dans l'index nul en commençant par le premier, puis d'écrire la nouvelle valeur dans le dernier index.

 
Alexey Viktorov #:

Si aucun objet n'est trouvé, c'est l'erreur de recherche d'objet...

ERR_OBJET_NON_TROUVÉ

4202

Objet graphique non trouvé


Pas besoin de l'alerter...

J'ai fait quelques tests... Voici ce qui se passe. Dans MQL5, il n'est pas nécessaire d'utiliser ObjectFind() lors de la création d'objets.
L'objet peut être créé sans vérification préalable de son existence (en utilisant simplement ObjectCreate). Même à l'intérieur du OnTick, un tel code ne provoquera aucune erreur _LastError.

Je ne sais pas comment c'est implémenté dans les profondeurs du code système de MQL5, peut-être y a-t-il un contrôle déjà chargé que l'objet sera créé seulement s'il n'est pas encore présent. Mais il s'avère qu'au moins lors de la création d'un objet dans MQL5, ObjectFind() n'est pas nécessaire. Et toutes ses propriétés sont invariablement mises à jour à chaque tic.

On ne peut pas en dire autant du MQL4. Lacréation d'un objet par-dessus un objet existant provoquera une erreur 4200 ("L'objet existe déjà"). Cela signifie que l'utilisation deObjectFind() est obligatoire pour sa création.Cela me laisse une possibilité simple de fermer ses propriétés à partir de mises à jour constantes sans générer d'erreurs _LastError.

Veuillez confirmer mes conclusions.

 
Alexey Viktorov #:

C'est-à-dire que la taille du tableau doit être exactement 3000 et que lorsqu'une nouvelle barre est formée, l'indice zéro doit être écrasé en premier ......... et la nouvelle valeur doit être ajoutée à la fin ?

Si j'ai bien compris, pourquoi ai-je besoin d'une boucle ? Simplement, le tableau lui-même doit être copié dans l'indice nul en commençant par le premier, puis la nouvelle valeur doit être ajoutée au dernier indice.

Eh bien, oui, c'est clair, mais s'il y a une rupture, par exemple, un retard, deux mesures sont apparues, je les note.

Merci beaucoup, je comprends, je vais essayer avec CopyTime.

 
leon_17 #:

J'ai fait quelques tests... Voici ce qui se passe. Dans MQL5, il n'est pas nécessaire d'utiliser ObjectFind() lors de la création d'objets.
L'objet peut être créé sans vérification préalable de son existence (en utilisant simplement ObjectCreate). Même à l'intérieur du code OnTick, ce code ne provoquera aucune erreur _LastError.

Je ne sais pas comment c'est implémenté dans les profondeurs du code système de MQL5, peut-être y a-t-il un contrôle déjà chargé que l'objet sera créé seulement s'il n'est pas encore présent. Mais il s'avère qu'au moins lors de la création d'un objet dans MQL5, ObjectFind() n'est pas nécessaire. Et toutes ses propriétés sont invariablement mises à jour à chaque tic.

On ne peut pas en dire autant du MQL4. Lacréation d'un objet par-dessus un objet existant provoquera une erreur 4200 ("L'objet existe déjà"). Cela signifie que l'utilisation deObjectFind() est obligatoire pour sa création.Cela me laisse une possibilité simple de fermer ses propriétés à partir de mises à jour constantes sans générer d'erreurs _LastError.

Veuillez confirmer mes conclusions.

Il ne s'agit pas du tout d'erreurs. Le fait est que lorsqu'un objet est créé, certaines propriétés lui sont attribuées. Pourquoi perdre du temps machine et des ressources à redéfinir des propriétés sans apporter de modifications. Il est beaucoup plus économique de vérifier si l'objet existe et d'attribuer de nouvelles propriétés uniquement à celles qui doivent être modifiées. Par exemple, une étiquette de texte ou Lable, souvent seul le texte de ces objets doit être modifié. Toutes les autres propriétés restent telles quelles...
 
Mikhail Toptunov #:

Eh bien oui, cela semble clair, mais s'il y a une rupture, par exemple un retard, deux mesures apparues, je les note.

Merci, je comprends, je vais essayer avec CopyTime.

Eh bien, si vous le faites via CopyTime, il n'y a pas de problème du tout. Il suffit de copier les 3000 barres actuelles et c'est tout.

 

Comment puis-je définir le niveau du stop suiveur régulier dans le code du programme lorsque je passe un ordre en attente ou que j'ouvre une position sur le marché ?

La façon dont cela est fait manuellement est claire. Les programmes pour les trailing stops non standard ne sont pas intéressants.

Merci d'avance.

 
   for (int symbols; symbols < SymbolsTotal(true); symbols++) 
      {
        Print(SymbolName(symbols ,true));
      }

Pourquoi une telle conception ne fonctionne-t-elle pas ? Où est l'erreur... (le journal est vide)


Et le journal est vide.

enum c_mode
  {
   Auto,
   Manual,    
  };

input c_mode MODE         = Auto;

if (MODE==Auto) 
      {
      Print("MODE=Auto");
      }