ООП, шаблоны и макросы в mql5, тонкости и приёмы использования - страница 15

 
Vict:

Что-то я переусложнил )).

Ну и пусть использует первый, самое оптимальное, наверное.

Написать несколько раз TEST не проблема ведь.

Можно еще вот так, но только в обратном порядке все вызываться будет.

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

хм, думал упростить себе задачу, чтобы по клаве меньше стучать, но теперь придется со всеми примерами разбираться

@Vladimir Simakov круто!

@Vict пасиб!

ЗЫ: если честно, то только первый пример макроса понимаю, остальные и даже рядом не вкурил (((

 
Igor Makanu:

хм, думал упростить себе задачу, чтобы по клаве меньше стучать, но теперь придется со всеми примерами разбираться

@Vladimir Simakov круто!

@Vict пасиб!

ЗЫ: если честно, то только первый пример макроса понимаю, остальные и даже рядом не вкурил (((

Магия препроцессора называется)))

 
Vladimir Simakov:

Магия препроцессора называется)))

я в курсе, практики никогда не было, поэтому и туго идет обучение (((

а можно вот такой код обернуть в макрос?


//--- 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

и так 10 раз? 

вернее еще осталось 8 раз... но не знаю, когда буду в оптимизаторе прогонять может добавлю или уберу параметры, еще не дописал код причем  (комментарии одинаковые, но одна цифра отличается - первая строка)

 
Igor Makanu:

я в курсе, практики никогда не было, поэтому и туго идет обучение (((

а можно вот такой код обернуть в макрос?


и так 10 раз? причем и комментарии одинаковые, но одна цифра отличается

Да, без проблем, но только без комментариев. Да, и заменить их на /* ... */ не получится, компилятор, в этом случае, перестает воспринимать его в контексте текстового описания внешних переменных для таблицы настроек. Проверял.

 
Vladimir Simakov:

Да, без проблем, но только без комментариев. Да, и заменить их на /* ... */ не получится, компилятор, в этом случае, перестает воспринимать его в контексте текстового описания внешних переменных для таблицы настроек. Проверял.

тогда засада, комментарии придется руками править.... в общем для тестов пойдет, один фиг быстрее, ковыряю свой код, много времени на правку уходит, никак до тестера не доберусь...

если не затруднит сделайте пример без комментариев



PS: может идея лажа, а времени с утра в голове кручу, что хотел бы увидеть.... пока сетку ордеров в оптимизатор, но конечная цель другая (хочу вместо неких фиксированных шагов сетки, прикрутить полином чтобы оптимизатор коэффициенты прогнал, затем возможно тоже самое, но рядах Тейлора посмотреть охота ;)  ), но сетку сначала нужно посмотреть что оптимизатор покажет, тестовый полигон в общем готовлю )))

 
Igor Makanu:

я в курсе, практики никогда не было, поэтому и туго идет обучение (((

а можно вот такой код обернуть в макрос?


и так 10 раз? 

вернее еще осталось 8 раз... но не знаю, когда буду в оптимизаторе прогонять может добавлю или уберу параметры, еще не дописал код причем  (комментарии одинаковые, но одна цифра отличается - первая строка)

Можно написать небольшую функцию, которая будет этот код генерировать (и сохранять в файл или в буфер обмена).

 
Andrey Khatimlianskii:

Можно написать небольшую функцию, которая будет этот код генерировать (и сохранять в файл или в буфер обмена).

 ну вот, пришел и уничтожил весь поэтический настрой, в прозе это не сложно, примерно так:

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

))))

но все равно спасибо за совет!

 
Vladimir Simakov:

Да, без проблем, но только без комментариев. Да, и заменить их на /* ... */ не получится, компилятор, в этом случае, перестает воспринимать его в контексте текстового описания внешних переменных для таблицы настроек. Проверял.

Может вы что-то не так сделали? Или в макросах другое поведение?

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:

Может вы что-то не так сделали? Или в макросах другое поведение?

Да другое. Связано с тем, что препроцессор запускается до синтаксического анализатора и тупо собирает текст, при этом комментарии внутри макроса откидываются на этапе работы препроцессора. При этом, если Вы оставите в макросе //, то можете получить лютый баг по своей вине.