mql5中的OOP、模板和宏,细微之处和用途 - 页 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 谢谢你!

ZS:说实话,我只理解了宏的第一个例子,其他的都不明白((())。

 
Igor Makanu:

嗯,我以为我会让自己更容易少敲键盘,但现在我不得不处理所有的例子了。

@Vladimir Simakov 酷!

@Vict 谢谢你!

ZS:说实话,我只理解了宏的第一个例子,其他的都不明白((())。

预处理器的魔力被调用)))

 
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:

是的,没有问题,但就是没有评论。是的,并且用/* ... 替换它们。*/将不起作用,在这种情况下,编译器在设置表的外部变量的文本描述中停止接受它。已检查。

那么就有问题了,这些评论将不得不由hand.... 来纠正。对于测试来说,这很好,反正它更快,我正在处理我的代码,编辑它需要很多时间,我不能到测试器...

如果你不介意,请举个例子,不加评论。



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:

你做错了什么吗?还是宏的行为方式不同?

是的,它是不同的。这与预处理器在解析器 之前启动并愚蠢地收集文本有关,宏内的注释在预处理器的阶段被丢弃。同时,如果你把//留在宏中,你可能会因为自己的过错而得到一个猛烈的错误。