Discussion de l'article "Créez votre propre robot de trading en 6 étapes !"

 

Un nouvel article Créez votre propre robot de trading en 6 étapes ! a été publié :

Si vous ne savez pas comment les classes de trades se construisent et que vous avez peur des mots tels que « Programmation orientée objet », alors cet article est pour vous. En fait, vous n'avez pas besoin de connaître les détails pour écrire votre propre module de signaux de trading. Suivez simplement quelques règles simples. Tout le reste sera fait par l'assistant MQL5, et vous obtiendrez un robot de trading prêt à l'emploi !

Certes, l'assistant MQL5 simplifie grandement la création d'Expert Advisors, mais vous devez d'abord savoir ce qui sera utilisé comme entrée pour cela. Pour créer automatiquement un Expert Advisor à l'aide de l'Assistant MQL5, assurez-vous que ses composants adhèrent aux cinq classes de base de la section Classes de base des Expert Advisors :

  • CExpertBase est une classe de base pour quatre autres classes.
  • CExpert est la classe pour créer un robot de trading ; c'est la classe qui trade.
  • CExpertSignal est une classe pour créer un module de signaux de trading ; l'article concerne cette classe.
  • CExpertTrailing est une classe de suivi d’un Stop Loss de protection.
  • CExpertMoney est la classe de gestion monétaire.

Voici toute la force de la « grande et terrible » approche qu'on appelle la programmation orientée objet (POO). Mais n'ayez pas peur, maintenant presque tout le monde a un téléphone portable avec beaucoup de fonctions, et presque personne ne sait comment il fonctionne. Nous n'avons pas besoin d'étudier tout cela, nous n'aborderons que quelques fonctions de la classe CExpertSignal.

Dans cet article, nous allons passer en revue les étapes de création d'un module de signaux de trading, et vous verrez comment faire cela sans avoir à apprendre la POO ou les cours. Mais si cela vous dit, vous pouvez donc explorer davantage.

Auteur : MetaQuotes

[Supprimé]  
Et tout irait bien - les robots de trading sont créés en 5 clics de souris, ils peuvent être testés dans un testeur pour le système de trading оптимизации параметров, vous pouvez mettre le robot résultant à trader sur votre compte et vous n'avez pas besoin de modifier quoi que ce soit avec un fichier.
Un tel robot peut-il être autorisé à négocier ? Après tout, la bibliothèque des classes de négociation ne contient pas de traitement des diverses erreurs, ce qui était une condition nécessaire même au championnat, sans parler de la négociation réelle. Il est plus juste d'écrire que vous pouvez créer un Expert Advisor en cinq clics uniquement pour une vérification rapide des idées dans le testeur, mais qu'un tel Expert Advisor ne sera pas adapté au trading.
 
Merci pour votre travail ! Et merci pour la photo de la boîte et des cubes ! Ça systématise :-)
 

pour continuer...

J'ai pensé à convertir les lignes de cet exemple :

if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)

if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA)

Dans l'algorithme :

1) deux tableaux :

le premier contient m_method_fast et m_method_slow

le second contient les valeurs de l'énumération ENUM_MA_METHOD.

2) Dans une boucle, en prenant la valeur du premier tableau, vérifier si elle se trouve dans le second.

Pouvez-vous me dire comment mettre cela en œuvre ?

Je comprends qu'il est nécessaire de connecter CArray . Mais quel type ?

Qui peut, s'il vous plaît, écrire une partie du code, parce que les choses élémentaires de base, et avec la syntaxe je ne peux pas encore attraper.

Je vous remercie.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Методы скользящих - Документация по MQL5
 
bivmail:

pour continuer...

J'ai pensé à convertir les lignes de cet exemple :

if(m_method_fast!=MODE_SMA && m_method_fast!=MODE_EMA && m_method_fast!=MODE_SMMA && m_method_fast!=MODE_LWMA)

if(m_method_slow!=MODE_SMA && m_method_slow!=MODE_EMA && m_method_slow!=MODE_SMMA && m_method_slow!=MODE_LWMA)

Dans l'algorithme :

1) deux tableaux :

le premier contient m_method_fast et m_method_slow

le second contient les valeurs de l'énumération ENUM_MA_METHOD.

2) Dans une boucle, en prenant la valeur du premier tableau, vérifier si elle se trouve dans le second.

Pouvez-vous me dire comment mettre cela en œuvre ?

Je comprends qu'il est nécessaire de connecter CArray . Mais quel type ?

Qui peut, s'il vous plaît, écrire une partie du code, parce que les choses élémentaires de base, et avec la syntaxe je ne peux pas encore attraper.

Je vous remercie !

Comme ceci :

func(int& array1[],int& array2[])
  {
   int total1=ArraySize(array1);
   int total2=ArraySize(array2);
//---
   for(int i=0;i<total1;i++)
     {
      for(int j=0;j<total2;j++)
        {
         if(array1[i]==array2[j])
           {
            // l'a trouvé
           }
        }
     }
  }
 

Oui, j'en suis déjà arrivé là dans C++ pour débutants :-)

Sauf qu'il n'existe pas de type de données ENUM_MA_METHOD à cet endroit

Comment puis-je savoir de quel type de données se compose cette énumération ? Est-il possible de parcourir en boucle l'énumération ENUM_MA_METHOD elle-même ?

Je vois deux façons de procéder :

//première façon de décrire les deux tableaux

  ENUM_MA_METHOD l_array_enum_ma_method[3];

  l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

  print("array size %d", ArraySize(l_array_enum_ma_method));

  print("ENUM_MA_METHOD size %d", ArraySize(ENUM_MA_METHOD));

  

   ENUM_MA_METHOD l_array_select_method[1];

   l_array_select_method[0]=m_MethodFast;

   l_array_select_method[1]=m_MethodSlow;

   //suivant le régime

   

   //deuxièmement, connecter la bibliothèque

   //#include <Arrays\ArrayInt.mqh>

     CArrayInt *l_array_enum_ma_method=new CArrayInt;

   l_array_enum_ma_method[0]=MODE_SMA;

  l_array_enum_ma_method[1]=MODE_EMA;

  l_array_enum_ma_method[2]=MODE_SMMA;

  l_array_enum_ma_method[3]=MODE_LWMA;

   l_array_enum_ma_method.Sort();

   //--- élément de recherche

   if(l_array_enum_ma_method.Search(m_MethodFast)!=-1) printf("Element found");

   else                        printf("Element not found");

   //--- supprimer le tableau

   delete l_array_enum_ma_method;

dans la seconde, il faut connecter une bibliothèque d'un type spécifique, et quel est le type de ENUM_MA_METHOD ?

hmm... étrange, j'ai cliqué sur répondre et il s'est avéré qu'il s'agissait d'un nouveau post....

 
Voir comment insérer le code correctement.
 
bivmail:

Oui, j'en suis déjà arrivé là dans C++ pour débutants :-)

Sauf qu'il n'existe pas de type de données ENUM_MA_METHOD à cet endroit

Comment puis-je savoir de quel type de données se compose cette énumération ? Est-il possible de parcourir en boucle l'énumération ENUM_MA_METHOD elle-même ?

Je vois deux façons de procéder :

dans la seconde, il faut connecter une bibliothèque d'un type spécifique, et quel est le type de ENUM_MA_METHOD ?

hmm... étrange, j'ai cliqué sur répondre et il s'est avéré que c'était un nouveau post....

Première méthode :

 ENUM_MA_METHOD l_array_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};
//--- plus loin dans la ligne

Deuxièmement :

#include <Arrays\ArrayInt.mqh>

CArrayInt l_array_enum_ma_method;
//---
l_array_enum_ma_method.Add(MODE_SMA);
l_array_enum_ma_method.Add(MODE_EMA);
l_array_enum_ma_method.Add(MODE_SMMA);
l_array_enum_ma_method.Add(MODE_LWMA);
//--- plus loin dans la ligne

Je n'arrive pas à comprendre pourquoi tant d'étapes sont nécessaires ?

 

oops... merci beaucoup, c'est ce que j'essaie de faire... off.

Dans le premier cas, j'ai déjà vu cette façon d'enregistrer, mais je n'ai pas encore réalisé ce dont j'avais besoin,

et dans le second cas, j'ai été dérouté par ArrayInt. Je pensais que puisque Int, cela signifiait que seule la valeur numérique était stockée, mais ,

il semble que le compilateur convertisse MODE_SMA en un nombre, et lors de la récupération de la valeur, il sera nécessaire d'effectuer une conversion implicite (en utilisant des parenthèses) vers le type(ENUM_MA_METHOD), c'est-à-dire quelque chose de similaire à ce qui suit.

  ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

P.S. Dans la troisième section 3. Méthodes de définition des paramètres, nous devrions effacer les lignes déclarées prématurément, je pense que
:

 CiCustom          m_fast_ma;        // indicateur en tant qu'objet
   CiCustom          m_slow_ma;        // indicateur en tant qu'objet
 
bivmail:

P.S. Dans la troisième section 3. Méthodes de définition des paramètres, je pense que nous devrions effacer les lignes déclarées prématurément :

Supprimé, merci.
 

Je commençais à m'enthousiasmer, mais je n'arrive pas à contourner ce problème (comm - j'ai lu sur le transfert d'adresse mémoire, mais cela n'a pas fonctionné de cette façon non plus) :

Le compilateur renvoie l'erreur 'm_MethodFast' - expression constante requise, ' m_MethodSlow' - expression constante requise

Bien sûr, ce sont des questions pour les nuls. Peut-être devrais-je poser ces questions dans un autre fil, afin de ne pas encombrer l'article ?

//première façon de décrire les deux tableaux
//int *Finger_m_MethodFast ;
//int *Finger_m_MethodSlow ;
//Finger_m_MethodFast=&m_MethodFast ;
//Finger_m_MethodFast=&m_MethodSlow ;
// int l_array1_select_method[]={Finger_m_MethodFast,Finger_m_MethodFast} ;
   ENUM_MA_METHOD l_array1_select_method[]={m_MethodFast,m_MethodSlow};
   ENUM_MA_METHOD l_array2_enum_ma_method[]={MODE_SMA,MODE_EMA,MODE_SMMA,MODE_LWMA};

   int total_array1=ArraySize(l_array1_select_method);
   int total_array2=ArraySize(l_array2_enum_ma_method);
   bool NoErrorsFlag=false;
   for(int i_array1=0;i_array1<total_array1;i_array1++)
     {

      for(int i_array2=0;i_array2<total_array2;i_array2++)
        {
         if(l_array1_select_method[i_array1]=l_array2_enum_ma_method[i_array2])
           {
            NoErrorsFlag=true;
           }
        }
      if(!NoErrorsFlag)
        {
         PrintFormat("Invalid smoothing type %s moving average !",EnumToString(l_array1_select_method[i_array1]));
        }

     }

   if(!NoErrorsFlag)
     {
      return(false);
     }