OOP, modelos e macros em mql5, sutilezas e usos - página 15

 
Vict:

Eu já compliquei demais as coisas )).

Portanto, deixe o primeiro ser usado, é provavelmente a melhor maneira.

Não é um problema escrever o TESTE várias vezes.

Você também pode fazer isso, mas somente em ordem inversa tudo será chamado.

#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, pensei que seria mais fácil para mim bater menos no teclado, mas agora vou ter que lidar com todos os exemplos

@Vladimir Simakov cool!

@Vict obrigado!

ZS: Para ser honesto, eu entendo apenas o primeiro exemplo de macros, o resto não está nem perto de entender (((

 
Igor Makanu:

Hmm, pensei que seria mais fácil para mim bater menos no teclado, mas agora vou ter que lidar com todos os exemplos

@Vladimir Simakov cool!

@Vict obrigado!

ZS: Para ser honesto, eu entendo apenas o primeiro exemplo de macros, o resto não está nem perto de entender (((

A magia do pré-processador é chamada))))

 
Vladimir Simakov:

A magia do pré-processador é chamada))))

Eu sei, eu nunca tive nenhuma prática, por isso é difícil de aprender (((

Posso transformar este código em uma 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

E assim 10 vezes?

Ainda faltam 8 vezes... mas não sei, quando o executar no otimizador talvez eu adicione ou remova parâmetros, ainda não finalizei o código (os comentários são os mesmos, mas um dígito é diferente - primeira linha)

 
Igor Makanu:

Eu sei, eu nunca tive nenhuma prática, por isso é difícil de aprender (((

Este código pode ser embrulhado em uma macro?


E assim 10 vezes? E os comentários são os mesmos, mas um dígito é diferente.

Sim, sem problemas, mas apenas sem comentários. Sim, e substituí-los por /* ... */ não funcionará, o compilador, neste caso, deixa de aceitá-lo no contexto da descrição textual das variáveis externas para a tabela de ajustes. Verificado.

 
Vladimir Simakov:

Sim, sem problemas, mas apenas sem comentários. Sim, e substituí-los por /* ... */ não funcionará, o compilador, neste caso, deixa de aceitá-lo no contexto da descrição textual das variáveis externas para a tabela de ajustes. Verificado.

então é um problema, os comentários terão de ser corrigidos manualmente.... É bom para testes, é mais rápido de qualquer forma, estou trabalhando no meu código, leva muito tempo para editá-lo, não consigo chegar ao testador...

se você não se importa, faça um exemplo sem comentários



PS: talvez a idéia seja uma bobagem, mas desde a manhã tenho pensado na minha cabeça o que gostaria de ver.... Por enquanto uma grade de ordens no otimizador, mas o objetivo final é diferente (em vez de algumas etapas fixas da grade, eu quero anexar um polinômio para fazer o otimizador rodar os coeficientes, então talvez o mesmo, mas eu gostaria de ver as linhas de Taylor ;), mas a grade primeiro eu preciso ver o que o otimizador mostra, um polígono de teste em geral eu preparo )))

 
Igor Makanu:

Eu sei, eu nunca tive nenhuma prática, por isso é difícil de aprender (((

Posso transformar este código em uma macro?


E assim 10 vezes?

Ainda faltam 8 vezes... mas não sei, quando o executar no otimizador talvez eu adicione ou remova parâmetros, ainda não escrevi código (os comentários são os mesmos, mas um dígito é diferente - primeira linha)

Você pode escrever uma pequena função que irá gerar este código (e salvar em um arquivo ou prancheta).

 
Andrey Khatimlianskii:

Você poderia escrever uma pequena função que geraria este código (e salvá-lo em um arquivo ou prancheta).

bem, lá vai você e destrói todo espírito poético, em prosa não é difícil, assim:

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

))))

Mas obrigado pelo conselho de qualquer forma!

 
Vladimir Simakov:

Sim, sem problemas, mas apenas sem comentários. Sim, e substituí-los por /* ... */ não funcionará, o compilador, neste caso, deixa de aceitá-lo no contexto da descrição textual das variáveis externas para a tabela de ajustes. Verificado.

Talvez você tenha feito algo errado? Ou as macros estão se comportando de maneira 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:

Você fez algo errado? Ou as macros estão se comportando de maneira diferente?

Sim, é diferente. Tem a ver com o fato de que o pré-processador começa antes do analisador e estupidamente coleta o texto, com comentários dentro da macro sendo descartados na etapa do pré-processador. Ao mesmo tempo, se você sair // em uma macro, você pode ter um bug feroz através de sua própria falha.