OOP, plantillas y macros en mql5, sutilezas y usos - página 15

 
Vict:

He complicado demasiado las cosas )).

Así que, que se use la primera, es probablemente la mejor manera.

No es un problema escribir TEST varias veces.

También se puede hacer esto, pero sólo en el orden inverso en que se llamará todo.

#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, pensé que me facilitaría golpear menos el teclado, pero ahora tendré que lidiar con todos los ejemplos

@Vladimir Simakov ¡Genial!

@Vict ¡gracias!

ZS: Para ser honesto, sólo entiendo el primer ejemplo de macros, el resto no son ni siquiera cerca de entender (((

 
Igor Makanu:

Hmm, pensé que me facilitaría golpear menos el teclado, pero ahora tendré que lidiar con todos los ejemplos

@Vladimir Simakov ¡Genial!

@Vict ¡gracias!

ZS: Para ser sincero, sólo entiendo el primer ejemplo de las macros, el resto no lo entiendo ni de lejos (((

Se llama a la magia del preprocesador)))

 
Vladimir Simakov:

Se llama la magia del preprocesador)))

Lo sé, nunca he tenido práctica, por eso es difícil de aprender (((

¿Puedo convertir este código en una 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

Y así, ¿10 veces?

Es decir, aún quedan 8 veces... pero no sé, cuando lo ejecute en el optimizador quizás añada o quite parámetros, aún no he finalizado el código (los comentarios son los mismos, pero un dígito es diferente - primera línea)

 
Igor Makanu:

Lo sé, nunca he tenido práctica, por eso es difícil de aprender (((

¿Se puede envolver este código en una macro?


¿Y así 10 veces? Y los comentarios son los mismos, pero un dígito es diferente

Sí, no hay problema, pero no hay comentarios. Sí, y sustituirlos por /* ... */ no funcionará, el compilador, en este caso, deja de aceptarlo en el contexto de la descripción de texto de las variables externas para la tabla de ajustes. Comprobado.

 
Vladimir Simakov:

Sí, no hay problema, pero no hay comentarios. Sí, y sustituirlos por /* ... */ no funcionará, el compilador, en este caso, deja de aceptarlo en el contexto de la descripción de texto de las variables externas para la tabla de ajustes. Comprobado.

entonces es un problema, los comentarios tendrán que ser corregidos por hand.... Está bien para las pruebas, es más rápido de todos modos, estoy trabajando en mi código, me lleva mucho tiempo editarlo, no puedo llegar al probador...

si no te importa, haz un ejemplo sin comentarios



PD: tal vez la idea sea una tontería, pero desde la mañana he estado pensando en mi cabeza lo que me gustaría ver.... Por ahora una rejilla de órdenes en el optimizador, pero el objetivo final es diferente (en lugar de unos pasos de rejilla fija, quiero adjuntar un polinomio para que el optimizador ejecute los coeficientes, entonces tal vez lo mismo, pero me gustaría ver las filas de Taylor ;) ), pero la rejilla primero necesito ver lo que muestra el optimizador, un polígono de prueba en general me preparo ))

 
Igor Makanu:

Lo sé, nunca he tenido práctica, por eso es difícil de aprender (((

¿Puedo convertir este código en una macro?


Y así, ¿10 veces?

Es decir, aún quedan 8 veces... pero no sé, cuando lo ejecute en el optimizador quizás añada o quite parámetros, todavía no he escrito el código (los comentarios son los mismos, pero un dígito es diferente - la primera línea)

Puedes escribir una pequeña función que genere este código (y lo guarde en un archivo o en el portapapeles).

 
Andrey Khatimlianskii:

Podrías escribir una pequeña función que generara este código (y lo guardara en un archivo o en el portapapeles).

bueno, ahí vas y destruyes todo el espíritu poético, en prosa no es difícil, así:

#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());
  }
//+------------------------------------------------------------------+

))))

¡Pero gracias por el consejo de todos modos!

 
Vladimir Simakov:

Sí, no hay problema, pero no hay comentarios. Sí, y sustituirlos por /* ... */ no funcionará, el compilador, en este caso, deja de aceptarlo en el contexto de la descripción de texto de las variables externas para la tabla de ajustes. Comprobado.

¿Quizás hiciste algo mal? ¿O es que las macros se comportan de forma diferente?

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:

¿Has hecho algo malo? ¿O es que las macros se comportan de forma diferente?

Sí, es diferente. Tiene que ver con el hecho de que el preprocesador comienza antes que el analizador sintáctico y recoge estúpidamente el texto, y los comentarios dentro de la macro se descartan en la etapa del preprocesador. Al mismo tiempo, si dejas // en una macro, puedes tener un error feroz por tu propia culpa.