Discussion de l'article "Rédaction d'un Expert Advisor à l'aide de l'approche de programmation orientée-objet MQL5"

 

Un nouvel article Rédaction d'un Expert Advisor à l'aide de l'approche de programmation orientée-objet MQL5 a été publié :

Cet article est axé sur l'approche orientée-objet pour faire ce que nous avons fait dans l'article « Guide étape par étape pour écrire un Expert Advisor en MQL5 pour les débutants » : créer un Expert Advisor simple. La plupart des gens pensent que c'est difficile, mais je tiens à vous rassurer qu'au moment où vous aurez fini de lire cet article, vous serez en mesure d'écrire votre propre Expert Advisor qui est orienté-objet.

Alors, quelle est la prochaine étape ? 

Est-ce que je vous ai entendu dire, déboguer ? Peut-être que vous avez raison. Il est toujours bon de tester et de voir si votre code contient des erreurs, sinon vous serez déçu lorsque vous le publiez. Le problème ici est que c'est juste un fichier d'inclusion, ce n'est pas un code ou un script de conseiller expert ou code indicateur qui peut être joint au graphique. À ce stade, vous avez deux options (d'après mon expérience),,

  • soit vous risquez d'appuyer sur le bouton de débogage de votre éditeur pour que le débogueur signale toute erreur dans votre code à l'exception d'une erreur "pas de fichier exécutable produit", qui s'affichera car un fichier .mqh ne peut pas être compilé dans un .ex5 déposer.  OR
  • Allez-y et écrivez le code de l'EA qu’utilisera votre classe. Une fois que vous avez commencé à déboguer l'EA, le fichier inclus sera vérifié avec lui. En fait, c'est la façon la meilleure et la plus acceptable de le faire.

Auteur : Samuel Olowoyo

 

En général, ce n'est pas mal, mais c'est un peu boiteux en ce qui concerne le slogan OOP utilisé dans le nom. Par exemple, pourquoi le stoploss, le take et le price sont-ils placés en dehors de la classe ? STP et TKP devraient être des membres, nous avons besoin de la méthode setSLTP ; latest_price et levels devraient être pris en compte dans openBuy/openSell. Ils sont eux-mêmes écrits de manière très irrationnelle - il est souhaitable de ne laisser qu'un seul if avec appel MarginOK, et à l'intérieur de celui-ci ajouter la première ligne de la vérification if(Chk_Margin == 0) return(true) ;

Et encore une petite chose. Pourquoi Chk_Margin est-il déclaré comme int-, alors qu'il n'est utilisé que comme bool ? Il serait préférable de le décrire par un type minimal suffisant, sinon on peut se demander, en lisant le code source, ce qui se passera si Chk_Margin == 2, 3, etc.

 
Avec la paire spécifiée sur la période spécifiée avec les paramètres d'entrée par défaut, vous ne pouvez pas obtenir un graphique de balance aussi beau. L'auteur avait-il d'autres citations ? Pourriez-vous joindre les paramètres d'entrée avec lesquels un tel graphique a été obtenu ?
 
capr:
Avec la paire spécifiée sur la période spécifiée avec les paramètres d'entrée par défaut, vous ne pouvez pas obtenir un graphique de balance aussi beau. L'auteur avait-il d'autres citations ? Pourriez-vous joindre les paramètres d'entrée avec lesquels un tel graphique a été obtenu ?

Quelle devrait être la différence entre les cotations de l'auteur et les vôtres pour que les résultats soient très différents))))))) J'ai obtenu presque la même chose, et le résultat final est même un peu meilleur :

 

le design est déroutant

   if(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4)
     {
       return(true);
     }
     else
     {
       return(false);
     }
[Supprimé]  
ortv:

le design est déroutant

Qu'est-ce qui vous déplaît tant ? Bien sûr, je ne l'ai pas vu dans le contexte du code....
 
Interesting:
Qu'est-ce qui vous déplaît tant ? Bien sûr, je ne l'ai pas vu dans le contexte du code.....

n'est-ce pas ainsi qu'on l'écrit habituellement dans ces cas-là ?

return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
[Supprimé]  
ortv:

N'est-ce pas ainsi qu'ils l'écrivent habituellement dans de tels cas ?

Vous pouvez le faire de cette manière, si le code est reproduit exactement et qu'il n'y a rien d'autre dans le traitement...
 

Je ne comprends pas la partie suivante du code :

// Copie le prix de clôture de la barre précédente (barre 1) dans la variable Expert Advisor correspondante.
   Cexpert.setCloseprice(mrate[1].close);  // prix de clôture de la mesure 1
//--- Vérifier s'il existe une position d'achat
   if (Cexpert.checkBuy()==true)
   {
      if (Buy_opened) 
         {
            Alert("Nous avons déjà une position à acheter !!!); 
            return;    // Ne pas ajouter à la position longue
         }
      double aprice = NormalizeDouble(latest_price.ask,_Digits);
      double stl    = NormalizeDouble(latest_price.ask - STP*_Point,_Digits);
      double tkp    = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits);
      int    mdev   = 100;
      // passer la commande
      Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev);
   }
Si nous allons ouvrir une position d'achat, nous devrions nous concentrer sur le dernier prixdemandé, mais lorsque nous définissons un Stop Loss et un Take Profit pour une telle position, nous devrions nous concentrer sur le dernier prixoffert. Est-ce correct ? Pourquoi le Stop Loss et le Take Profit sont-ils fixés sur la base du prix d'achat dans le texte du code ? S'agit-il d'une erreur d'impression ou d'une particularité d'une stratégie spécifique (le code a une construction similaire pour l'ouverture d'une position de vente) ?
[Supprimé]  
Yedelkin:

Je ne comprends pas la partie suivante du code :

Si nous allons ouvrir une position d'achat, nous devrions nous concentrer sur le dernier prixdemandé, mais lorsque nous définissons un Stop Loss et un Take Profit pour une telle position, nous devrions nous concentrer sur le dernier prixoffert. Est-ce exact ? Dans ce cas, pourquoi le Stop Loss et le Take Profit sont-ils fixés sur la base du prix d'achat dans le texte du code ? S'agit-il d'une erreur d'impression ou d'une particularité d'une stratégie spécifique (le code a une construction similaire pour l'ouverture d'une position de vente) ?

Voici la logique (probablement, je l'utilise habituellement aussi) :

1. Le prix d'ouverture d' une position d'achat est considéré comme étant le prix d' achat (Ask) (et il est correct) ;

Disons que nous ouvrons à 1,27 sur l'EURUSD.

2. Lors de l'ouverture d'une position, nous obtenons la différence égale au spread, pour l'achat c'est Ask-Bid (perte potentielle si nous clôturons au prix actuel) ;

Supposons que le spread soit égal à 5 pips. Ainsi, l'offre à l'ouverture sera à 1,2695 (n'est-ce pas ?).

3. Les positions longues sont fermées au prix de l'offre (et c'est tout à fait logique).

Ainsi, lorsque l'offre passe à 1,27, nous obtenons un BU sur la position (n'est-ce pas ?).

4. Mais nous devons également obtenir un profit (100 pips dans la cotation standard).

C'est-à-dire que le TP doit être supérieur à l'Open de 100 pips. Dans notre cas, il s'agit de 1,28 (n'est-ce pas ?).

En même temps, le TP sera déclenché si le Bid (et non le Ask) atteint ce 1,28.....

5. Le SL doit également être défini (disons qu'il est de 50 pips). Dans notre exemple, il sera situé à 1,2650 (50 pips en dessous de l'ouverture).

Dans quelles conditions le SL fonctionne-t-il ?

Logiquement, il devrait fonctionner lorsque le prix passe ces mêmes 50 pips contre nous (c'est-à-dire que l'Ask dans les pièces de clôture sur SL devrait logiquement être à ces mêmes 1,2650).

Où devrait se situer le Bid dans ce cas ? Et à ce moment-là, il sera situé à 1,2645 (parce que Spred par la condition que nous avons 5 pips).

En se rappelant que les Longs sont fixes.

6. Maintenant, regardons ce qui se passe réellement (prenons l'ouverture du marché d'une position longue dans MQL4 comme exemple).

//Взято из справки по OrderSend
 ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point);

Ce que nous voyons ici

Le prix d'ouverture est considéré comme le prix d'achat, le prix de vente est considéré comme le prix d'achat et le prix de vente est considéré comme le prix d'achat.

Dans notre cas, nous obtiendrons ce modèle.

OrderSend(Symbol(),OP_BUY,1,Open = Ask,3,SL = Bid-50*Point,TP Ask+100*Point);

Remplaçons nos données ici :

OrderSend(Symbol(),OP_BUY,1,1.2700,3,1.2695-50*Point,TP 1.2700+100*Point);

Ce que nous obtenons à la fin - Open = 1.2700 SL= 1.2645 TP 1.28

PS

Comparons avec les données originales :

Ordre - Ouverture = 1,2700 SL= 1,2645 TP 1,28

Modèle - Ouverture = 1.2700 SL= 1.2645 TP 1.28

 
Interesting:

Il y a ici une logique (très probablement, j'ai tendance à l'utiliser aussi) :

1. Le prix d'ouverture pour Buy est considéré comme Ask (et il est correct) ;

Disons que nous ouvrons à 1,27 sur l'EURUSD

2. Lors de l'ouverture d'une position, nous obtenons la différence égale à l'écart, pour l'achat, c'est Ask-Bid (perte potentielle si nous clôturons au prix actuel) ;

Supposons que l'écart soit égal à 5 pips. Ainsi, l'offre à l'ouverture sera à 1,2695 (n'est-ce pas ?).

5. Le SL doit également être défini (disons qu'il est de 50 pips). Dans notre exemple, il sera situé à 1,2650 (50 pips en dessous de l'ouverture).

Dans quelles conditions le SL sera-t-il déclenché ?

Logiquement, il devrait fonctionner lorsque le prix passe ces mêmes 50 pips contre nous (c'est-à-dire que le Ask en clôture des pièces sur le SL devrait logiquement se situer à ces mêmes 1,2650).

Où devrait se situer le Bid dans ce cas ? Et à ce moment-là, il sera situé à 1,2645 (parce que Spred par la condition que nous avons 5 pips).

Rappelons que les Longs sont fixes.

Si l'offre à l'ouverture sera à 1,2695, nous avons déjà 5 pips de perte automatiquement. Si en même temps le SL est à 50 pips selon l'idée du développeur, alors nous avons 45 pips de plus à aller dans la direction défavorable avant qu'il ne se déclenche. C'est-à-dire que lorsque le stoploss est déclenché, le Bid ne devrait pas être à 1.2645, mais à 1.2650 ; et le Ask, respectivement, à 1.2655.