[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 267

 
yosuf:
Merci, là sur le lien, il y a une solution logicielle au problème, et je ne sais pas quoi faire. Qu'est-ce que cela a à voir et comment puis-je résoudre ce problème ? Pourquoi l'EA a bien fonctionné pendant un mois, et maintenant il y a un problème ? Si l'erreur était dans le code ? Il s'avère que ce fil de discussion n'est pas destiné aux débutants s'il me charge de répondre à des questions. Je suis frustré.

J'ai écrit une telle chose dans mon EA juste après le début :

//--- Section A: start - checking.
   if (!IsExpertEnabled())
      {Comment("Expert is NOT working. Check the reason."); return(0);}
   if (!IsConnected())
      {Comment("No connection!"); return(0);}
   if (IsTradeContextBusy())
      {Comment("Trade flow is busy. Wait..."); Sleep(5*1000); return(0);}
   if (AccountFreeMargin()<1000*Lot_super)
      {Comment("No money to trade. Free Margin = ",AccountFreeMargin()); Sleep(20*1000); return(0);}
//--- Section A: end - checking.

Essayez-le, peut-être que certains éléments vous seront utiles à vous aussi.

 
drknn:


1. ok. Int start() a été déclaré. J'ai toujours rendu zéro. J'ai aussi vu les commandes return(-1) et même return(-2) dans le code. Quelle est la bonne façon de choisir ce code ?

2. La question naturelle qui se pose est donc la suivante : est-il possible de déclarer start() de l'EA/indicateur/script non pas de type int(), mais de n'importe quel autre type et ensuite de renvoyer quoi au terminal ? En d'autres termes, que fait le terminal avec la valeur renvoyée par return() ?

1. Comment décidez-vous du retour à une fonction normale ?

2. Vous pouvez avoir n'importe quel type, tout comme une fonction normale. Le terminal ne fait rien avec les valeurs retournées. Il les ignore.

Fonctions spéciales

 
Zhunko:

1. comment décidez-vous du retour à une fonction normale ?

2. Vous pouvez avoir n'importe quel type, tout comme une fonction normale. Le terminal ne fait rien avec les valeurs retournées. Il les ignore.


1. Pour décider ce qu'une fonction ordinaire doit retourner, je dois savoir pourquoi le code principal a besoin d'une telle valeur. Par exemple, si je veux prendre la décision d'ouvrir un ordre d'achat lorsqu'il y a un signal, je vais écrire une fonction qui renvoie le nombre d'ordres d'achat déjà ouverts. En fonction de leur nombre, le code prendra une décision en suivant la logique intégrée dans le code. Je ne sais pas quelle logique est intégrée dans le code de retour. Aujourd'hui, je parcourais un article sur la création d'un sémaphore et je suis tombé sur un code de retour (-2). Surpris, j'ai posé une question ici. C'est tout. ( https://www.mql5.com/ru/articles/1412 - article ici).

2. le terminal ignore les valeurs retournées. C'est vrai ? Si c'est le cas, alors une nouvelle question légitime se pose, pourquoi dans la création d'un EA/indicateur/script, le développeur met dans un modèle exactement int, car il serait plus raisonnable d'y mettre void - alors le terminal ne doit rien ignorer - nous gagnerions 1 tact de temps processeur ? Peut-être qu'il y a une certaine logique dans QUOI retourner des fonctions int init(), int deinit() et int start() ? Je pense que Roche l'a déjà expliqué à quelqu'un quelque part - il s'est souvenu d'une description du moment où il faut renvoyer zéro et du moment où il faut renvoyer (-1). C'est justement cette explication que je cherchais. Dommage que je n'aie pas pu le trouver...

P.S.

L'auteur de l'article utilise la déclaration (-2) pour ses propres besoins. Mais le fait est que parfois la fonction start() se termine par un code retournant une valeur différente de zéro. Et ce n'est pas une seule personne qui le fait. C'est exactement cette logique que nous voulons comprendre.

 

On dirait que c'est là dans le texte.

Les fonctions prédéfinies peuvent avoir des paramètres. Cependant, lorsque ces fonctions sont appelées par le terminal client, aucun paramètre n'est passé en externe, mais les valeurs par défaut sont utilisées.

Il s'agit des paramètres entrant dans la fonction, et non des paramètres renvoyés par celle-ci.

 
merci pour votre réponse !
drknn:
Il s'agit d'un compteur de commandes. Eh bien, il se peut, par exemple, que vous vouliez savoir dans le code s'il y a des ordres d'achat sur le marché pour une certaine paire de devises et avec un certain nombre magique, par exemple. Si c'est le cas, par exemple, un autre ordre d'achat ne peut être ouvert. Le compteur de commandes est donc nécessaire pour prendre une décision.
 
paladin80:

J'ai écrit ça dans mon EA juste après le début :

Essayez-le, vous pourriez en trouver certains utiles.

Merci, j'ai trouvé mon erreur. Lorsque mon EA s'est bloqué pour la raison donnée dans l'article (lien ci-dessus), je l'ai fermé et recommencé mais j'ai oublié de changer le maître d'ordre de 123 à 124 et deux EAs dirigés différemment ont obtenu les mêmes mags et ont commencé à rivaliser pour voir qui ouvre les ordres plus rapidement. Si la première commande était ouverte en premier, ce n'était pas la même chose que, disons, Vendre ou vice versa. Dès que j'ai changé la magie de la deuxième mise à jour de l'EA, les deux ont commencé à fonctionner normalement. Si l'erreur se reproduit, je suivrai vos conseils. Merci pour les réponses.
 

comment ces lignes peuvent être comprises :

volume des commandes de retour

if(buys>0) return(buys) ;

sinon retour(-vendues) ;

} ?

 

Écrire un scénario :

int start(){
  Print("Попытка ретурна 136");
  return(136);
}

Jetez-le sur le tableau et regardez le journal :

2012.07.20 12:04:11 111 NZDUSD,M15: removed
2012.07.20 12:04:11 111 NZDUSD,M15: uninit reason 0
2012.07.20 12:04:11 111 NZDUSD,M15: Попытка ретурна 136
2012.07.20 12:04:11 111 NZDUSD,M15: loaded successfully

(ici 111 est le nom du script). Nous voyons la ligne " uninit reason 0 " - apparemment le terminal attendait le zéro !

Essayez la même chose avec (-1) :

int start(){
  Print("Попытка ретурна -1");
  return(-1);
}

Le résultat est le même :

2012.07.20 12:08:19 111 NZDUSD,M15 : supprimé
2012.07.20 12:08:19 111 NZDUSD,M15 : raison uninit 0
2012.07.20 12:08:19 111 NZDUSD,M15 :Tentative de retour -1

2012.07.20 12:08:19 111 NZDUSD,M15 : chargé avec succès

Le terminal semble se soucier de savoir si le zéro est renvoyé ou non.

P.S.

En général, sur le web, je suis tombé sur cette réponse :

retour 0 - le programme a terminé son travail sans erreur
return 1 - ou un nombre supérieur, le programme a terminé son travail avec une erreur et renvoie le code d'erreur pour un traitement ultérieur.

Dans tout système d'exploitation, un programme renvoie toujours un code d'erreur.

Le seul problème est que notre retour ne renvoie pas le code au système d'exploitation, mais au terminal. Cela laisse la question ouverte.

 
drknn:

Écrire un scénario :

Jetez-le sur le tableau et regardez le journal :

(ici 111 est le nom du script). Nous voyons la ligne " uninit reason 0 " - apparemment le terminal attendait le zéro !

Essayez la même chose avec (-1) :

Le résultat est le même :

Apparemment, le terminal se soucie de savoir si un zéro est renvoyé ou non.


uninit reason est le code de raison de l'arrêt de l'Expert Advisor.

https://docs.mql4.com/ru/constants/uninit

 
Vous êtes légèrement confus, UNINIT REASON n'a rien à voir avec les rendements relatifs aux fonctions standard. Ecrivez un EA et appelez le "init" à partir du "start" avec différents résultats de retour et voyez. En faithttps://docs.mql4.com/ru/basis/functions/special le doc dit tout parfaitement. Relisez-le attentivement .
Raison: