OOP, templates et macros dans mql5, subtilités et utilisations - page 15

 
Vict:

J'ai trop compliqué les choses ;)).

Donc, laissez le premier être utilisé, c'est probablement le meilleur moyen.

Ce n'est pas un problème d'écrire TEST plusieurs fois.

Vous pouvez également le faire, mais uniquement dans l'ordre inverse où tout sera appelé.

#define  LINE(dId) EA.AddDealsSettings(InDealType_##dId,InVolType_##dId,InVolume_##dId,InPrice_##dId,InVolCoeff_##dId,InClosePips_##dId,Mirror)

#define  BLOCK1 LINE(01)
#define  BLOCK2 LINE(02); BLOCK1
#define  BLOCK3 LINE(03); BLOCK2
#define  BLOCK4 LINE(04); BLOCK3
#define  BLOCK5 LINE(05); BLOCK4
#define  BLOCK6 LINE(06); BLOCK5
#define  BLOCK7 LINE(07); BLOCK6
#define  BLOCK8 LINE(08); BLOCK7
#define  BLOCK9 LINE(09); BLOCK8
#define  BLOCK10 LINE(10); BLOCK9

#define  SEND(dCount) do {BLOCK##dCount;} while(false)

void OnStart()
  {
   SEND(10);
  }
 

Hmm, je pensais me faciliter la tâche en tapant moins sur le clavier, mais maintenant je vais devoir gérer tous les exemples.

@Vladimir Simakov cool !

@Vict merci !

ZS : Pour être honnête, je ne comprends que le premier exemple de macros, le reste est loin d'être compris (((

 
Igor Makanu:

Hmm, je pensais me faciliter la tâche en tapant moins sur le clavier, mais maintenant je vais devoir gérer tous les exemples.

@Vladimir Simakov cool !

@Vict merci !

ZS : Pour être honnête, je ne comprends que le premier exemple de macros, le reste est loin d'être compris (((

La magie du préprocesseur s'opère))))

 
Vladimir Simakov:

La magie du préprocesseur s'opère))))

Je sais, je n'ai jamais eu de pratique, c'est pourquoi c'est difficile d'apprendre ((()

Puis-je transformer ce code en une macro ?


//--- input parameters
input ENUM_DEALTYPE        InDealType_01=BUY;            //1.------------------------------ Order ------------------------------
input int                  InPrice_01        =  000;     //Start price
input double               InVolume_01       =  0.01;    //Start Volume
input ENUM_VOLUMERATIO     InVolType_01=MultiplyAlways;  //Next operation with volume coefficient
input double               InVolCoeff_01     =  1.5;     //Volume coefficient
input ENUM_DISTANCERATIO   InDistType_01     =  NotMove; //Next price type
input double               InDistCoeff_01    =  1.23;    //Coefficient next open price
input int                  InDistShift_01    =  150;     //Shift next open price
input int                  InClosePips_01    =  200;     //TakeProfit>0 or StopLoss<0

input ENUM_DEALTYPE        InDealType_02=BUY;            //2.------------------------------ Order ------------------------------
input int                  InPrice_02        =  000;     //Start price
input double               InVolume_02       =  0.01;    //Start Volume
input ENUM_VOLUMERATIO     InVolType_02=MultiplyAlways;  //Next operation with volume coefficient
input double               InVolCoeff_02     =  1.5;     //Volume coefficient
input ENUM_DISTANCERATIO   InDistType_02     =  NotMove; //Next price type
input double               InDistCoeff_02    =  1.23;    //Coefficient next open price
input int                  InDistShift_02    =  150;     //Shift next open price
input int                  InClosePips_02    =  200;     //TakeProfit>0 or StopLoss<0

Et donc 10 fois ?

Je veux dire, il y a encore 8 fois... mais je ne sais pas, quand je l'exécuterai dans l'optimiseur, je peux ajouter ou enlever des paramètres, je n'ai pas encore finalisé le code (les commentaires sont les mêmes, mais un chiffre est différent - première ligne)

 
Igor Makanu:

Je sais, je n'ai jamais eu de pratique, c'est pourquoi c'est difficile d'apprendre ((()

Ce code peut-il être enveloppé dans une macro ?


Et donc 10 fois ? Et les commentaires sont les mêmes, mais un chiffre est différent.

Oui, pas de problème, mais pas de commentaires. Oui, et les remplacer par /* ... */ ne fonctionnera pas, le compilateur, dans ce cas, cesse de l'accepter dans le contexte de la description textuelle des variables externes pour la table des paramètres. Vérifié.

 
Vladimir Simakov:

Oui, pas de problème, mais pas de commentaires. Oui, et les remplacer par /* ... */ ne fonctionnera pas, le compilateur, dans ce cas, cesse de l'accepter dans le contexte de la description textuelle des variables externes pour la table des paramètres. Vérifié.

alors il y a un problème, les commentaires devront être corrigés par hand.... C'est bien pour les tests, c'est plus rapide de toute façon, je travaille sur mon code, ça prend beaucoup de temps pour le modifier, je ne peux pas accéder au testeur....

si vous le voulez bien, faites un exemple sans commentaires



PS : l'idée est peut-être nulle, mais depuis ce matin, je pense dans ma tête à ce que j'aimerais voir..... Pour l'instant, une grille d'ordres dans l'optimiseur, mais le but final est différent (au lieu de certaines étapes de la grille fixe, je veux attacher un polynôme pour faire l'optimiseur exécuter les coefficients, puis peut-être la même chose, mais je voudrais voir les lignes de Taylor ;) ), mais la grille d'abord j'ai besoin de voir ce que l'optimiseur montre, un polygone d'essai en général je prépare ))))

 
Igor Makanu:

Je sais, je n'ai jamais eu de pratique, c'est pourquoi c'est difficile d'apprendre ((()

Puis-je transformer ce code en une macro ?


Et donc 10 fois ?

Je veux dire, il y a encore 8 fois... mais je ne sais pas, quand je l'exécuterai dans l'optimiseur peut-être que j'ajouterai ou enlèverai des paramètres, je n'ai pas encore écrit le code (les commentaires sont les mêmes, mais un chiffre est différent - première ligne)

Vous pouvez écrire une petite fonction qui générera ce code (et l'enregistrera dans un fichier ou dans le presse-papiers).

 
Andrey Khatimlianskii:

Vous pourriez écrire une petite fonction qui générerait ce code (et l'enregistrerait dans un fichier ou dans le presse-papiers).

eh bien, voilà, tu détruis tout esprit poétique, en prose c'est pas dur, comme ça :

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#include <Files\FileTxt.mqh>
CFileTxt FOut;

#define   COUNT 10


const string code0[]=
  {
   "input ENUM_DEALTYPE        InDealType_","=BUY;            //",".------------------------------ Order ------------------------------"
  };

const string code1[]=
  {
   "input int                  InPrice_","        =  000;     //Start price",
   "input double               InVolume_","       =  0.01;    //Start Volume",
   "input ENUM_VOLUMERATIO     InVolType_","=MultiplyAlways;  //Next operation with volume coefficient",
   "input double               InVolCoeff_","     =  1.5;     //Volume coefficient",
   "input ENUM_DISTANCERATIO   InDistType_","     =  NotMove; //Next price type",
   "input double               InDistCoeff_","    =  1.23;    //Coefficient next open price",
   "input int                  InDistShift_","    =  150;     //Shift next open price",
   "input int                  InClosePips_","    =  200;     //TakeProfit>0 or StopLoss<0"
  };
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   if(FOut.Open(__FILE__+".txt",FILE_WRITE|FILE_COMMON)!=INVALID_HANDLE)
     {
      for(int i=0;i<COUNT;i++)
        {
         string N=IntegerToString(i,2,'0');
         FOut.WriteString(code0[0]+N+code0[1]+IntegerToString(i)+code0[2]+"\n");
         for(int j=0;j<8;j++)
           {
            FOut.WriteString(code1[j*2]+N+code1[j*2+1]+"\n");
           }
        }
      printf("Write to file %s",FOut.FileName());
     }
   else printf("Open file error № %i",GetLastError());
  }
//+------------------------------------------------------------------+

))))

Mais merci quand même pour le conseil !

 
Vladimir Simakov:

Oui, pas de problème, mais pas de commentaires. Oui, et les remplacer par /* ... */ ne fonctionnera pas, le compilateur, dans ce cas, cesse de l'accepter dans le contexte de la description textuelle des variables externes pour la table des paramètres. Vérifié.

Peut-être que tu as fait quelque chose de mal ? Ou les macros se comportent-elles différemment ?

input double d1=1.02,/*Первая переменная double*/ d2=3;/*Вторая переменная double*/
input double d3=3.07;/*Третья переменная double*/
input int i1=5,/*Первая переменная int*/ i2=7;/*Вторая переменная int*/
 
Alexey Viktorov:

Avez-vous fait quelque chose de mal ? Ou les macros se comportent-elles différemment ?

Oui, c'est différent. Cela est dû au fait que le préprocesseur démarre avant l'analyseur syntaxique et collecte bêtement le texte, les commentaires à l'intérieur de la macro étant rejetés au stade du préprocesseur. En même temps, si vous laissez // dans une macro, vous risquez d'attraper un bug féroce par votre propre faute.
Raison: