Caractéristiques du langage mql4, subtilités et techniques

 
Cette rubrique abordera les méthodes non documentées de travail avec le langage mql4, des exemples de résolution de certains problèmes. Il serait souhaitable que cette branche soit plus proche dans son contenu de la FAQ, que de la discussion. Je suggère que tous les programmeurs expérimentés partagent leurs solutions et leurs techniques de programmation, en particulier la couverture des fonctionnalités non décrites dans l'aide.
 
Eh bien, laissez-moi commencer.

Pour clôturer un ordre, il n'est pas du tout nécessaire de définir le type d'ordre et le prix correspondant à ce type. Il suffit d'écrire OrderClosePrice()

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

Il y a beaucoup plus d'inexactitudes dans l'aide. Prenons l'exemple deSetIndexBuffer(). Quel est le problème de l'aide ?

"Paramètres

indice

[in] Numéro du tampon de l'indicateur. La numérotation commence par 0. Le nombre doit être inférieur à la valeur déclarée dans #property indicator_buffers". (cette affirmation est fausse)

La #propriété indicator_buffers spécifie le nombre de tampons à afficher. Peut-être que ce que l'aide veut dire, bien que je ne l'aie pas vérifié, est que les tampons utilisés pour le calcul n'ont pas besoin de recevoir un numéro par SetIndexBuffer(). Mais ce que j'ai vérifié, c'est que si le tampon utilisé pour le calcul reçoit un numéro avec SetIndexBuffer(), sa valeur peut être récupérée via iCustom().

 
Je ne comprends pas.
 

Puisque les développeurs visitent le fil de discussion - il y a une question sur les "subtilités et les astuces" :

Exemple d'une impression formatée : PrintFormat("Bid=%.5f", Bid)

Question : existe-t-il un moyen, au lieu d'une précision fixe (ici5), de spécifier une condition dans la description du format pour que la précision dépende de _Digits ? Pour faire sans 'prétraitement' comme PrintFormat("Bid=%s", DoubleToString(Bid, _Digits))

 

Dans MQL4, le même code peut donner des résultats différents selon l'état de #property strict. Et c'est là que la compilation réussit dans les deux cas. Ainsi, si l'exécution est "décousue", vous pouvez chercher la cause au mauvais endroit (strict) pendant longtemps.

 
Alexander Puzanov:

Question : au lieu d' une précision fixe (ici5), est-il possible de spécifier une condition dans la description du format pour que la précision dépende de _Digits ?

Non, des exemples sont disponibles sur https://www.mql5.com/ru/docs/common/printformat
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

J'écris un indicateur dans MQL4. J'ai été confronté à une fonctionnalité non documentée du style DRAW_HISTOGRAM.

Pour afficher les valeurs sur le graphique, j'ai besoin de deux tampons : pour la valeur supérieure de l'histogramme et pour la valeur inférieure. Lors du mappage des tampons du tableau des indicateurs, si les tampons du style auront les valeurs 0 et 1, 2 et 3, 4 et 5, etc. tout s'affiche normalement. Cependant, si les tampons de style se voient attribuer des valeurs commençant par OTHER, c'est-à-dire 1 et 2, 3 et 4, 5 et 6, les lignes de l'histogramme ne seront pas affichées correctement dans le graphique, bien que les valeurs dans la fenêtre de données soient correctes.

Veuillez ajouter une mention de cette particularité à la documentation, ou la corriger, car ce n'est pas toujours le cas que la description du style DRAW_HISTOGRAM commence par un tampon pair !

Du SD.
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bugs, bugs, questions

-Aleks-, 2017.02.07 18:21

Pouvez-vous me dire si dans un Expert Advisor MT4, si un indicateur personnalisé avec plus d'un tampon graphique est constamment appelé, alors le recalcul se fait à chaque appel ou tous les tampons sont calculés en une fois et vous pouvez vous référer à l'indicateur dans le code de nombreuses fois et ne pas s'attendre à ce qu'il y ait un gaspillage de ressources. Je suis également intéressé de savoir ce qui se passe si le code n'est pas terminé (s'exécute plus d'un tick), mais que la valeur de l'indicateur change.


Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Slawa, 2017.02.08 08:20

Tous les tampons sont calculés en même temps. Interroger tranquillement les valeurs de l'indicateur - il n'y aura pas de nouveau calcul.

Dans MT4 l'indicateur appelé depuis l'Expert Advisor travaille dans le flux de cet EA et sur une copie de ses données historiques. Vous pouvez boucler l'Expert Advisor, mais en même temps vous recevrez les données de l'indicateur calculées au moment de l'appel OnTick. Jusqu'à ce que vous appeliez RefreshRates. RefreshRates met à jour les données historiques de l'Expert Advisor, après quoi toutes ses données seront recalculées au premier appel de l'indicateur.

 
Alexey Viktorov:
Pour clôturer un ordre, il n'est pas nécessaire de préciser le type d'ordre et le prix correspondant à ce type. Il suffit d'écrire close au prix OrderClosePrice()

Ainsi, vous pouvez utiliser OrderClosePrice uniquement APRÈS le OrderSelect correspondant. Parce que OrderSelect copie une fois les données pour les fonctions Order(const), et le même RefreshRates n'est pas capable de les mettre à jour.

C'est-à-dire que si, par exemple, OrderClosePrice ne parvient pas à clôturer, vous devez refaire OrderSelect avant la prochaine tentative (RefreshRates n'est pas nécessaire).

ZS Ce fil de discussion date de 2005! Voici les arguments détaillés des développeurs.

 
Rashid Umarov:
Non, il y a des exemples sur https://www.mql5.com/ru/docs/common/printformat

C'est une honte...

---

Pour que le poste ne soit pas inutile :

au lieu de StringGetCharacter("a", 0), vous pouvez écrire juste 'a'- souvent nécessaire lors de l'analyse des chaînes de caractères avec StringSplit